【问题标题】:Cognito user pool: How to use refreshToken to get new accessToken after accessToken gets expired in aws cognito java sdk?Cognito用户池:在aws cognito java sdk中accessToken过期后如何使用refreshToken获取新的accessToken?
【发布时间】:2020-05-18 23:57:08
【问题描述】:

我在基于 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 文档,我们可以在 accessToken 过期时使用 refreshToken 获取新的 accessToken 或 idToken 以继续用户会话。但是在文档中没有提到如何为此目的使用 refreshToken。任何有关这方面的帮助都是不言而喻的。提前致谢。

【问题讨论】:

    标签: java scala amazon-cognito aws-java-sdk playframework-2.6


    【解决方案1】:

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

    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
      }
    

    【讨论】:

    • 我已经复制了这段代码(它几乎和我的一样),它失败了,出现了无效的刷新令牌错误:/ - 我想我疯了。跨度>
    【解决方案2】:

    很高兴您找到了问题的答案。为帮助将来将其作为其他人的资源,以下是一些有用的链接:

    The AWS docs on token refresh

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

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

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

    【讨论】:

    • 有没有办法在不刷新访问令牌的情况下验证 refreshToken 是否有效或仍未撤销?因为如果我使用上面的代码,那么每次我点击受保护的 API 时它都会创建新的 accessToken。
    • 实际上我想使用 refreshToken 来确定用户是否已成功注销,因为 AdminGlobalSignOut 撤销了 refreshToken 但即使在注销后 accessToken 仍然有效 1 小时。如果您遇到过此类问题并找到解决方案,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 2018-01-15
    • 2017-02-01
    • 2020-12-01
    • 2017-10-21
    • 2018-10-18
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多