You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置并修改授权请求流程:

  1. 更新客户端的Allowed OAuth Flows配置

    • 登录AWS控制台,进入目标Cognito用户池的客户端设置页面
    • 在「Allowed OAuth Flows」中添加Authorization code grant(可根据业务需求保留或移除Implicit grant)
    • 确保「Allowed OAuth Scopes」包含openid(refresh token必须关联该权限),按需添加email、profile等其他 scope
  2. 调整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请求,参数如下:
      grant_type=authorization_code
      client_id=<你的客户端ID>
      redirect_uri=<你的应用回调URL>
      code=<第一步获取的授权码>
      
      成功后,Cognito会返回包含id_token、access_token和refresh_token的响应。
  3. (可选)处理客户端密钥
    如果你的客户端是后端服务这类「机密客户端」,需要在令牌交换请求中额外添加client_secret=<你的客户端密钥>;若是SPA这类「公开客户端」,则无需此参数。

注意事项

  • 授权码流比Implicit流更安全,令牌不会暴露在URL中,适合需要长期授权的场景
  • 确保你的回调URL已在Cognito客户端的「Allowed Callback URLs」中配置,否则请求会被拒绝
  • Refresh token的有效期可在用户池的「App client settings」中调整,默认有效期为30天

内容的提问来源于stack exchange,提问作者beanwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:25:24