gpt4 book ai didi

python-3.x - 如何从 python 向 AppSync 发送 GraphQL 查询?

转载 作者:行者123 更新时间:2023-12-03 17:44:02 25 4
gpt4 key购买 nike

我们如何使用 boto 通过 AWS AppSync 发布 GraphQL 请求?

最终,我试图模仿一个移动应用程序访问我们在 AWS 上的无堆栈/云形成堆栈,但使用 python。不是 javascript 或放大。

主要痛点是身份验证;我已经尝试了十几种不同的方法。这是当前的一个,它生成一个带有“UnauthorizedException”和“Permission denied”的“401”响应,考虑到我收到的一些其他消息,这实际上非常好。我现在使用 'aws_requests_auth' 库来完成签名部分。我假设它使用存储的 /.aws/credentials 对我进行身份验证来自我本地的环境,还是这样?

我对认知身份和池将在何处以及如何进入其中感到有些困惑。例如:说我想模仿注册顺序?

无论如何,代码看起来很简单;我只是不理解身份验证。

from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

APPSYNC_API_KEY = 'inAppsyncSettings'
APPSYNC_API_ENDPOINT_URL = 'https://aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com/graphql'

headers = {
'Content-Type': "application/graphql",
'x-api-key': APPSYNC_API_KEY,
'cache-control': "no-cache",
}
query = """{
GetUserSettingsByEmail(email: "john@washere"){
items {name, identity_id, invite_code}
}
}"""


def test_stuff():
# Use the library to generate auth headers.
auth = BotoAWSRequestsAuth(
aws_host='aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com',
aws_region='ap-southeast-2',
aws_service='appsync')

# Create an http graphql request.
response = requests.post(
APPSYNC_API_ENDPOINT_URL,
json={'query': query},
auth=auth,
headers=headers)

print(response)

# this didn't work:
# response = requests.post(APPSYNC_API_ENDPOINT_URL, data=json.dumps({'query': query}), auth=auth, headers=headers)

产量
{
"errors" : [ {
"errorType" : "UnauthorizedException",
"message" : "Permission denied"
} ]
}

最佳答案

这很简单——一旦你知道。有一些事情我没有欣赏:

  • 我已经假设 IAM 身份验证
    appsync 有多种处理身份验证的方法。我们正在使用 IAM,所以这就是我需要处理的,您的可能会有所不同。
  • 博托没有进入。
    我们想像任何普通下注者一样发出请求,他们不使用 boto,我们也不使用。浏览 AWS boto 文档是在浪费时间。
  • 使用 AWS4Auth 图书馆
    我们将向 aws 发送一个常规的 http 请求,因此虽然我们可以使用 python 请求,但它们需要通过附加 header 进行身份验证。
    而且,当然,AWS 身份验证 header 是特殊的,与所有其他 header 不同。
    You can try to work out how to do ityourself ,或者你可以去找已经做过的人:Aws_requests_auth ,我开始使用的那个,可能工作得很好,但我最终得到了 AWS4Auth .还有许多其他值(value)可疑的东西。亚马逊没有认可或提供(我能找到)。
  • 指定 appsync作为“服务”
    我们调用什么服务?我没有找到任何人在任何地方这样做的例子。所有的例子都是微不足道的 S3 或 EC2 甚至 EB,这留下了不确定性。我们应该与 api-gateway 服务交谈吗?更何况你将此详细信息输入 AWS4Auth 例程 ,或身份验证数据。显然,事后看来,该请求正在击中 Appsync,因此它将通过 Appsync 进行身份验证,因此在将身份验证 header 放在一起时指定“appsync”作为服务。

  • 它汇集在一起​​为:
    import requests
    from requests_aws4auth import AWS4Auth

    # Use AWS4Auth to sign a requests session
    session = requests.Session()
    session.auth = AWS4Auth(
    # An AWS 'ACCESS KEY' associated with an IAM user.
    'AKxxxxxxxxxxxxxxx2A',
    # The 'secret' that goes with the above access key.
    'kwWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgEm',
    # The region you want to access.
    'ap-southeast-2',
    # The service you want to access.
    'appsync'
    )
    # As found in AWS Appsync under Settings for your endpoint.
    APPSYNC_API_ENDPOINT_URL = 'https://nqxxxxxxxxxxxxxxxxxxxke'
    '.appsync-api.ap-southeast-2.amazonaws.com/graphql'
    # Use JSON format string for the query. It does not need reformatting.
    query = """
    query foo {
    GetUserSettings (
    identity_id: "ap-southeast-2:8xxxxxxb-7xx4-4xx4-8xx0-exxxxxxx2"
    ){
    user_name, email, whatever
    }}"""
    # Now we can simply post the request...
    response = session.request(
    url=APPSYNC_API_ENDPOINT_URL,
    method='POST',
    json={'query': query}
    )
    print(response.text)


    哪个产量
    # Your answer comes as a JSON formatted string in the text attribute, under data. 
    {"data":{"GetUserSettings":{"user_name":"0xxxxxxx3-9102-42f0-9874-1xxxxx7dxxx5"}}}

    获取凭据

    要摆脱硬编码的 key / secret ,您可以使用本地 AWS ~/.aws/config~/.aws/credentials ,它是这样做的......
    # Use AWS4Auth to sign a requests session
    session = requests.Session()
    credentials = boto3.session.Session().get_credentials()
    session.auth = AWS4Auth(
    credentials.access_key,
    credentials.secret_key,
    boto3.session.Session().region_name,
    'appsync',
    session_token=credentials.token
    )
    ...<as above>

    这似乎确实尊重环境变量 AWS_PROFILE以承担不同的角色。

    请注意 STS.get_session_token不是这样做的方法,因为它可能会尝试从角色中承担角色,具体取决于它的关键字与 AWS_PROFILE 值匹配的位置。 credentials 中的标签文件将起作用,因为 key 就在那里,但名称在 config 中找到文件不起作用,因为它已经承担了一个角色。

    关于python-3.x - 如何从 python 向 AppSync 发送 GraphQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60293311/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com