如何使用 IAM Auth 将 python websocket 连接到 AppSync 订阅?

Posted

技术标签:

【中文标题】如何使用 IAM Auth 将 python websocket 连接到 AppSync 订阅?【英文标题】:How to connect a python websocket to an AppSync subscription, with IAM Auth? 【发布时间】:2020-07-30 05:10:11 【问题描述】:

我希望 python 打开 AWS AppSync 订阅并接收更新。

官方博客对如何使用 IAM 对 websocket 进行身份验证一无所知。https://aws.amazon.com/blogs/mobile/appsync-websockets-python/

它遵循this document about signing http requests,它没有提到 websockets,因此没有提供任何线索来包含、排除或改变什么来启动 websocket。我担心在发生任何事情之前我需要相当长的时间来消化、适应和测试。

IAM_header = 
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
    "host": <HOST>,
    "x-amz-date": <ISO_UTC_TIMESTAMP>,,
    "X-Amz-Security-Token": <IAM SECURITY TOKEN>,
    "Authorization": <IAM SIGNATURE>

我想以前没有人这样做过并且可以分享一些见解或代码吗?

IAM_SIGNATURE 在创建 websocket 的上下文中,我们正在签名的“request_parameters”是什么?

到目前为止,我已将详细信息输入 requests_aws4auth 并将其中的标头填充到 websocket 中。这项工作收到了这样的回复:

消息

此请求的规范字符串应该是\n'POST\n/graphql/connect\n\nhost:iutysrbt2qxx7ekx2xi.appsync-api .AP-东南-2.amazonaws.com \ NX-AMZ-内容-SHA256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934852b855 \ NX-AMZ-日期:20200730T044539Z \ NX-AMZ-安全令牌:FwoGZpgV9hfLzGbDiPLCK1HMsXYJapqB299GReKYAALLKPOgifkFMi2VZsiycpLbxp7ZDGGO4NfSgEaULYm9GMMkGIj1Ck / 0YcckBNawWpisa6NxdMs = \ n \ n主机; X-amz- content-sha256;x-amz-date;x-amz-security-token\n44136fa355b3678a1b4fc21fe77e8310c060f61caaff8a'\n\nString-to-Sign应该是\n'AWS4-HMAC-SHA256\n20200730T044539Z \n20200730/ap-southeast-2/appsync/aws4_request\n29a5ecebf83602958c569f1ae18b5fa8353dd04833a833885'\n"],"type":"connection_error"

所以我需要弄清楚“Canonical String”、“String-to-Sign”以及如何将它们填充到 Authorization 标头中。

【问题讨论】:

【参考方案1】:

graphql-python/gql 自 version 3.0.0rc0 起支持 AWS AppSync。

它支持实时端点上的查询、变异甚至订阅。

它支持IAM、api key和JWT认证方式。

文档可通过here获取

以下是使用 IAM 身份验证的订阅示例:

import asyncio
import os
import sys

from gql import Client, gql
from gql.transport.appsync_websockets import AppSyncWebsocketsTransport

# Uncomment the following lines to enable debug output
# import logging
# logging.basicConfig(level=logging.DEBUG)


async def main():

    # Should look like:
    # https://XXXXXXXXXXXXXXXXXXXXXXXXXX.appsync-api.REGION.amazonaws.com/graphql
    url = os.environ.get("AWS_GRAPHQL_API_ENDPOINT")

    if url is None:
        print("Missing environment variables")
        sys.exit()

    transport = AppSyncWebsocketsTransport(url=url)

    async with Client(transport=transport) as session:

        subscription = gql(
            """
subscription onCreateMessage 
  onCreateMessage 
    message
  

"""
        )

        print("Waiting for messages...")

        async for result in session.subscribe(subscription):
            print(result)


asyncio.run(main())

【讨论】:

以上是关于如何使用 IAM Auth 将 python websocket 连接到 AppSync 订阅?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IAM 在 AWS Lambda 中调用 AppSync?

如何使用 python boto3 将新角色权限附加到 aws 中的 iam_role?

使用 Pulumi 创建 EKS 后如何修改 `aws-auth` Config Map?

python boto3将IAM角色附加/替换为ec2

如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?

如何使用python语言实现用户登录系统