Cognito集成Azure AD SAML后,SAML登录无Refresh Token如何解决?
解决Cognito SAML登录无法获取Refresh Token的问题
核心原因
你当前的客户端仅启用了Implicit grant流,根据OAuth 2.0规范,Implicit流的设计目标是简化前端应用授权流程,直接返回id_token和access_token,不支持颁发refresh token。
你通过Cognito用户池自身登录时能拿到refresh token,是因为InitiateAuthCommand使用的是Cognito专属的USER_PASSWORD_AUTH认证流,不属于标准的Implicit OAuth流范畴,因此不受此限制。
解决步骤
要让SAML登录的用户获取refresh token,需要调整客户端OAuth配置并修改授权请求流程:
更新客户端的Allowed OAuth Flows配置
- 登录AWS控制台,进入目标Cognito用户池的客户端设置页面
- 在「Allowed OAuth Flows」中添加Authorization code grant(可根据业务需求保留或移除Implicit grant)
- 确保「Allowed OAuth Scopes」包含
openid(refresh token必须关联该权限),按需添加email、profile等其他 scope
调整SAML登录的授权流程
授权码流需要分两步完成,先获取授权码,再用授权码交换包含refresh token的令牌:- 第一步:发起授权请求获取授权码
https://<你的用户池域名>/authorize?response_type=code&identity_provider=<你的SAML IdP名称>&client_id=<你的客户端ID>&redirect_uri=<你的应用回调URL>&scope=openid+email+profile - 第二步:用授权码交换令牌
向Cognito令牌端点https://<你的用户池域名>/oauth2/token发起POST请求,参数如下:
成功后,Cognito会返回包含grant_type=authorization_code client_id=<你的客户端ID> redirect_uri=<你的应用回调URL> code=<第一步获取的授权码>id_token、access_token和refresh_token的响应。
- 第一步:发起授权请求获取授权码
(可选)处理客户端密钥
如果你的客户端是后端服务这类「机密客户端」,需要在令牌交换请求中额外添加client_secret=<你的客户端密钥>;若是SPA这类「公开客户端」,则无需此参数。
注意事项
- 授权码流比Implicit流更安全,令牌不会暴露在URL中,适合需要长期授权的场景
- 确保你的回调URL已在Cognito客户端的「Allowed Callback URLs」中配置,否则请求会被拒绝
- Refresh token的有效期可在用户池的「App client settings」中调整,默认有效期为30天
内容的提问来源于stack exchange,提问作者beanwa
相关产品推荐
相关产品推荐

