Python中如何实现用户登录并调用Amplify GraphQL端点
Python3.9+环境下通过邮箱密码登录发起Amplify GraphQL查询实现
前置说明
你搜到的大部分示例都是基于IAM鉴权的服务端调用场景,需要手动配置AK/SK、签名请求,和普通用户用邮箱密码登录的Cognito用户池鉴权逻辑完全不同,不需要走那套复杂流程。
整个实现逻辑只有两步:
- 用邮箱、密码对接Amplify背后的Cognito用户池完成登录,获取有效身份ID令牌
- 把令牌放到请求头里,直接用
requests向GraphQL端点发POST请求即可
依赖安装
在JupyterLab环境中先安装需要的第三方库,不用装全套AWS SDK或者Amplify CLI:
pip install requests pycognito
pycognito封装了Cognito登录的SRP加密校验逻辑,不用自己手写复杂的签名计算,适合数据分析场景快速使用。
可直接复用的代码
先从你所用Amplify项目的aws-exports.js配置文件里抄三个固定参数:用户池ID、Web端应用客户端ID、GraphQL API端点,替换代码里的对应占位符即可。
import requests import getpass from pycognito import Cognito # ========== 替换为你自己的Amplify配置 ========== USER_POOL_ID = "替换为aws_user_pools_id对应值" APP_CLIENT_ID = "替换为aws_user_pools_web_client_id对应值" GRAPHQL_ENDPOINT = "替换为aws_appsync_graphqlEndpoint对应值" USER_EMAIL = "替换为你的登录邮箱" # 用getpass隐式输入密码,避免明文存在Notebook里造成泄露 USER_PASSWORD = getpass.getpass("请输入登录密码:") # ============================================== def get_auth_token() -> str: """通过账号密码登录,获取Amplify GraphQL认可的鉴权令牌""" cognito_user = Cognito(USER_POOL_ID, APP_CLIENT_ID, username=USER_EMAIL) cognito_user.authenticate(password=USER_PASSWORD) return cognito_user.id_token def gql_query(query: str, variables: dict = None) -> dict: """发起GraphQL查询/变更请求""" auth_headers = { "Authorization": get_auth_token(), "Content-Type": "application/json" } request_body = { "query": query, "variables": variables or {} } resp = requests.post(GRAPHQL_ENDPOINT, json=request_body, headers=auth_headers) resp.raise_for_status() return resp.json() # 测试调用 if __name__ == "__main__": # 替换为你要执行的GraphQL语句 demo_query = """ query ListData { listYourModelName(limit: 20) { items { id field1 field2 createdAt } } } """ result = gql_query(demo_query) print(result)
使用注意事项
- 确保你使用的Cognito应用客户端没有开启客户端密钥校验,Amplify默认生成的Web端客户端默认关闭该配置,如果是自定义开启的客户端,初始化
Cognito对象时额外传入client_secret参数即可。 - Cognito返回的ID令牌默认有效期1小时,长时间跑批量分析任务时,可以直接用
pycognito自带的check_token()方法自动判断令牌是否过期、自动刷新,不用重复手动输密码。 - 只要你的账号本身已经被配置了对应GraphQL API的读取权限,返回结果和你在Web端用Amplify前端应用登录查询到的结果完全一致,不需要额外申请AWS控制台权限、不需要手动抓包拿凭证。
内容的提问来源于stack exchange,提问作者orome
相关产品推荐
相关产品推荐

