如何从Flask/Python调用带JWT授权的AWS API Gateway端点?
如何从Flask/Python调用带JWT认证的AWS API Gateway端点
因为你的API Gateway配置了JWT授权,调用时需要携带Cognito颁发的Access Token作为身份凭证,以下是具体实现步骤:
1. 获取用户的Cognito Access Token
通过flask-cognito-lib,用户登录后库会自动管理令牌的存储和验证。你可以通过auth.current_token()方法获取当前有效的Token对象,从中提取Access Token:
# 基于你已初始化的auth对象(示例代码中已创建) token = auth.current_token() access_token = token.access_token if token else None
2. 构造请求并携带JWT令牌
使用requests库发送HTTP请求,在请求头中添加Authorization: Bearer <access_token>,以下是在Flask路由中调用API的完整示例:
from flask import jsonify import requests # 受保护路由,仅登录用户可访问 @app.route("/invoke-lambda-api") @auth_required() def invoke_lambda_api(): # 获取当前用户的有效Access Token token = auth.current_token() if not token: return jsonify({"error": "无有效访问令牌"}), 401 # 替换为你的API Gateway实际端点URL api_gateway_url = "https://<endpoint ID>.execute-api.<region>.amazonaws.com/default/<endpoint-name>" # 构造请求头,携带JWT令牌 headers = { "Authorization": f"Bearer {token.access_token}", "Content-Type": "application/json" # 根据API需求调整内容类型 } # 发送请求(示例为GET,可根据API需求改为POST/PUT等) try: response = requests.get(api_gateway_url, headers=headers) response.raise_for_status() # 捕获HTTP错误状态码 return jsonify({"data": response.json()}) except requests.exceptions.RequestException as e: status_code = response.status_code if 'response' in locals() else 500 return jsonify({"error": f"API调用失败: {str(e)}"}), status_code
关键注意事项
- 安装依赖:确保已安装
requests库,执行pip install requests - 令牌有效期:Cognito Access Token默认有效期为1小时,
flask-cognito-lib会自动处理令牌刷新(若配置了Refresh Token),无需手动干预 - 权限验证:确认Cognito用户的令牌包含API Gateway授权器要求的声明(如用户组、audience等),否则会返回403/401错误
- CORS问题:你的API Gateway未启用CORS,但如果是Flask后端直接调用API(而非前端浏览器),则不受CORS限制;若需前端调用,需在API Gateway配置中开启CORS并允许对应的Origin
内容的提问来源于stack exchange,提问作者alagris
相关产品推荐
相关产品推荐

