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

Cognito用户池:在aws Cognito java sdk中accessToken过期后,如何使用refreshToken获取新的accessToken?,java,scala,amazon-cognito,aws-java-sdk,playframework-2.6,Java,Scala,Amazon Cognito,Aws Java Sdk,Playframework 2.6,我在基于scala play框架的web应用程序中使用aws cognito作为用户管理解决方案。我正在使用以下代码登录 var mIdentityProvider: AWSCognitoIdentityProvider = getAmazonCognitoIdentityClient; def sessionLogin(userName: String, password: String): AdminInitiateAuthResult = { val authParams: java.u

我在基于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、refreshToken和idToken。
根据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
  }

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

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

还要注意的是,其中包括有助于实现这一点的逻辑。请参阅,特别是关于在长期运行操作期间保持令牌新鲜的内容:

我遇到了这样一种情况:我的Cognito JWT令牌在长时间运行的S3上传时过期(1小时后失败)。我找不到任何方法来解决如何在请求中刷新令牌,所以经过放大的LIB和AWS SDK进行了数小时的挖掘之后,我终于找到了解决方案。您必须直接使用AWS SDK(对不起,放大存储)


有没有一种方法可以只验证refreshToken是否有效,或者在不实际刷新访问令牌的情况下仍然没有被撤销?因为如果我使用上述代码,那么每次我点击受保护的API时,它都会创建新的accessToken。实际上,我想使用refreshToken来确定用户是否已成功注销,因为AdminGlobalSignOut撤销refreshToken,但accessToken即使在注销后1小时内仍然有效。如果您遇到过此类问题并找到了解决方案,请告诉我。我已复制了此代码(与我的代码几乎相同),但失败时出现了无效的刷新令牌错误:/-我想我是疯了。万一,如果您已使用aws API调用注销,则会使刷新令牌无效,即您无法使用刷新令牌获取新的accessToken,但即使在注销后accessToken仍然有效1小时。