如何使用Python从redirect URI中提取AWS Cognito返回的code参数
Python提取AWS Cognito回调URL授权code实现方案
使用Python标准库urllib.parse即可完成参数提取,无需安装第三方依赖,兼容Cognito授权码流程所有回调场景。
核心实现代码
直接传入完整回调URL字符串,就能提取到code参数值:
from urllib.parse import urlparse, parse_qs def get_auth_code_from_callback(callback_url: str) -> str | None: # 解析URL结构 parsed_url = urlparse(callback_url) # 解析URL查询参数,parse_qs默认返回值为列表类型 query_params = parse_qs(parsed_url.query) # 取code参数第一个值,参数不存在时返回None return query_params.get("code", [None])[0] # 测试示例URL if __name__ == "__main__": demo_url = "https://example.com/callback?code=XXXX-XXXXX-XXXXXXX-XXXXX" code = get_auth_code_from_callback(demo_url) print(code) # 输出:XXXX-XXXXX-XXXXXXX-XXXXX
注意事项
- 不要用字符串切片、正则匹配的硬编码方式提取参数:Cognito回调在正常流程外还可能携带
state校验参数,授权失败时会携带error、error_description参数,硬编码提取很容易出现兼容问题。 - 提取code前要先做异常判断:如果URL中不存在code字段,要优先读取错误参数处理授权失败场景(比如用户取消授权、回调地址不匹配等问题)。
- 拿到有效code后,直接向Cognito用户池域名的
/oauth2/token端点发起POST请求即可换取access key,请求时需携带配置的客户端凭证,配置了客户端密钥的场景需要按规范做HTTP Basic认证。
Web框架场景简化写法
如果你是用后端Web服务接收回调请求,不需要手动解析完整URL,框架自带的请求对象可以直接读取查询参数:
- Flask示例
from flask import request @app.route("/callback") def cognito_callback(): auth_code = request.args.get("code") if not auth_code: err = request.args.get("error", "未知授权错误") return f"授权失败:{err}", 400 # 执行换取token逻辑 return "授权成功"
- FastAPI示例
from fastapi import Request @app.get("/callback") async def cognito_callback(request: Request): auth_code = request.query_params.get("code") if not auth_code: err = request.query_params.get("error", "未知授权错误") return {"status": "error", "msg": f"授权失败:{err}"} # 执行换取token逻辑 return {"status": "success", "code": auth_code}
内容的提问来源于stack exchange,提问作者Kevin Irawan
相关产品推荐
相关产品推荐

