繁体   English   中英

Cognito 用户池:在 aws cognito java sdk 中 accessToken 过期后,如何使用 refreshToken 获取新的 accessToken?

[英]Cognito user pool: How to use refreshToken to get new accessToken after accessToken gets expired in aws cognito java sdk?

我在基于 Scala Play 框架的 Web 应用程序中使用 aws cognito 作为用户管理解决方案。 我正在使用以下代码登录。

var mIdentityProvider: AWSCognitoIdentityProvider = getAmazonCognitoIdentityClient;

def sessionLogin(userName: String, password: String): AdminInitiateAuthResult = {
val authParams: java.util.Map[String, String] = new java.util.HashMap[String, String]()
    authParams.put("USERNAME", userName)
    authParams.put("PASSWORD", password)
    val authRequest = new AdminInitiateAuthRequest()
      .withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH)
      .withUserPoolId("***")
      .withClientId("***")
      .withAuthParameters(authParams)
    val authResult = mIdentityProvider.adminInitiateAuth(authRequest)
    authResult
}

上面的代码从 aws cognito 服务器返回accessToken、expiresIn、tokenType、refreshTokenidToken 根据 aws 文档,我们可以使用 refreshToken 在 accessToken 过期时获取新的 accessToken 或 idToken 以继续用户会话。 但是在文档中没有提到如何为此目的使用 refreshToken。 任何有关这方面的帮助将是可观的。 提前致谢。

我自己想通了。 以下是工作代码

def refreshAccessToken(refreshToken: String): AuthenticationResultType = {
    val authParams: java.util.Map[String, String] = new java.util.HashMap[String, String]()
    authParams.put("REFRESH_TOKEN", refreshToken)
    val authRequest = new AdminInitiateAuthRequest()
      .withAuthFlow(AuthFlowType.REFRESH_TOKEN_AUTH)
      .withUserPoolId("***")
      .withClientId("***")
      .withAuthParameters(authParams)
    val authResult = mIdentityProvider.adminInitiateAuth(authRequest)
    val resultType: AuthenticationResultType = authResult.getAuthenticationResult
    resultType
  }

很高兴您找到了问题的答案。 为了帮助在未来成为其他人的更多资源,这里有一些有用的链接:

关于令牌刷新的 AWS 文档

如果存在有效(未过期)的刷新令牌,则适用于 iOS 的移动 SDK 和适用于 Android 的移动 SDK 会自动刷新您的 ID 和访问令牌,并且 ID 和访问令牌的剩余有效期至少为 5 分钟。 如果刷新令牌已过期,您的应用程序用户必须通过再次登录到您的用户池来重新进行身份验证。

另请注意, Amplify API包含有助于解决此问题的逻辑。 请参阅此 Git 问题,特别是此评论,即使在长时间运行的操作中也能保持令牌新鲜:

我遇到了一种情况,即我的 Cognito JWT 令牌在长时间运行的 S3 上传时到期(在 1 小时标记处失败)。 我找不到任何关于如何在请求中间刷新令牌的解决方案,因此经过数小时的 Amplify 库和 AWS 开发工具包的挖掘,我终于找到了一个解决方案。 您必须直接使用 AWS 开发工具包(抱歉,Amplify Storage)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM