AWS Cognito Hosted UI重复生成授权码致旧令牌失效问题求助
解决AWS Cognito Hosted UI重复生成授权码及旧令牌失效问题
核心原因
Cognito Hosted UI默认每次触发授权流程时,会创建新的授权会话;若用户已有活跃会话,默认会终止旧会话(导致旧JWT令牌失效),这是默认的安全设计,但可通过配置调整。
解决方案
1. 添加prompt=none参数复用已有会话
在启动Hosted UI的授权请求里加上prompt=none参数,Cognito会先检查用户浏览器中是否有有效会话:
- 若会话未过期,直接返回现有授权码(或按配置直接返回令牌),不会生成新码,旧令牌也不会失效;
- 若会话过期或不存在,会返回
login_required错误,此时再引导用户走正常登录流程。
示例授权请求URL片段:
https://<你的用户池域名>/oauth2/authorize? response_type=code& client_id=<你的客户端ID>& redirect_uri=<你的回调地址>& scope=openid& prompt=none
2. 延长用户池客户端的会话有效期
登录AWS控制台,进入目标Cognito用户池,找到对应客户端,编辑应用客户端设置:
- 调整「Session duration」(会话有效期),默认1小时,可根据业务需求延长至最长1天;
- 会话有效期内重复触发Hosted UI,会直接复用现有会话,不会生成新授权码。
3. 禁用会话触发时的旧令牌撤销(可选)
如果业务允许旧令牌在新会话创建后仍生效,可修改客户端配置:
- 在用户池客户端的「App client settings」中,取消勾选「Revoke tokens on logout」;
- 注意:此设置会降低安全性,仅在业务明确需要时使用。
关键说明
授权码本身是一次性的(仅能兑换一次令牌),无法获取完全相同的授权码,但可通过复用会话避免发起新的授权流程,直接获取有效令牌(或复用本地存储的未过期令牌)。你的应用需自行存储JWT令牌(如浏览器localStorage或cookie),发起API请求前先检查令牌是否过期,未过期则直接使用,无需再次调用Hosted UI。
内容的提问来源于stack exchange,提问作者venkat
相关产品推荐
相关产品推荐

