AWS Cognito认证后Claims不可见,访问首页提示无Token
问题分析与解决步骤
你的核心问题是:拿到access_token后没有将其存入客户端并在后续请求中携带,导致authentication_required装饰器无法检测到Token。flask_awscognito的认证装饰器默认从请求头的Authorization: Bearer <token>字段读取Token,当前流程中缺少Token传递的关键环节。
具体修复步骤
1. 在回调路由中存储Token到Cookie并跳转首页
修改aws_cognito_redirect路由,将获取到的access_token存入浏览器Cookie,并重定向到首页(后续请求会自动携带Cookie):
@application.route('/aws_cognito_redirect') def aws_cognito_redirect(): access_token = aws_auth.get_access_token(request.args) # 生成响应并设置Cookie response = redirect('/') response.set_cookie( 'access_token', access_token, max_age=3600, # 匹配Cognito Token的默认有效期(1小时,可在用户池调整) secure=False, # 本地开发用False,生产环境必须改为True(HTTPS) httponly=True, # 防止XSS攻击窃取Token samesite='Lax' # 限制跨站Cookie传递,提升安全性 ) return response
2. 自动将Cookie中的Token注入请求头
添加请求钩子,把Cookie里的access_token自动放到Authorization请求头中,让authentication_required装饰器能识别:
@application.before_request def inject_token_to_header(): access_token = request.cookies.get('access_token') if access_token and 'Authorization' not in request.headers: request.headers['Authorization'] = f'Bearer {access_token}'
3. 可选:添加登出路由(清理Cookie)
如果需要登出功能,可添加路由清除Cookie:
@application.route('/sign_out') def sign_out(): response = redirect('/sign_in') response.delete_cookie('access_token') return response
额外检查项
- 确认Cognito用户池客户端的回调URL已配置为
http://localhost:5000/aws_cognito_redirect,与代码中的AWS_COGNITO_REDIRECT_URL完全一致。 - 确认用户池客户端使用的是授权码流程(Authorization Code Flow),这是
flask_awscognito默认支持的流程。 - 生产环境部署时,务必启用HTTPS,并将Cookie的
secure属性设为True,避免Token明文传输。
内容的提问来源于stack exchange,提问作者Miguel Gonzalez
相关产品推荐
相关产品推荐

