如何处理 Cognito 上的令牌过期问题

Posted

技术标签:

【中文标题】如何处理 Cognito 上的令牌过期问题【英文标题】:How to handle with token expiration on Cognito 【发布时间】:2018-03-23 01:54:01 【问题描述】:

我正在开发一个使用 AWS Cognito 作为身份提供者的应用程序。因此,用户在 AWS Cognito 池上进行身份验证并获取访问令牌、访问 ID 和刷新令牌。 然后用户可以向我的应用程序发出后端请求。我得到访问令牌验证它,在 Cognito AWS 上获取用户配置文件并授权请求。

问题是访问令牌过期后,客户端将过期令牌发送到后端,后端应用程序收到错误(令牌过期或未授权)。

我怎样才能使这个工作流程有效?

我正在考虑向客户端发送令牌已过期的消息,并且客户端会根据 Cognito 池刷新它。这是正确的方法吗?

【问题讨论】:

【参考方案1】:

当您从 Cognito 用户池获取访问令牌、ID 和刷新令牌时,您必须将其缓存在本地。 Access 和 ID 令牌的有效期为 1 小时,应在该时间段内尽可能重复使用。

这些代币是 JWT 代币,并在其内部保存到期时间。您可以解码 JWT 令牌并将此到期时间与令牌一起缓存。每次访问令牌的缓存时,还要检查当前时间与缓存的到期时间。如果过期,使用 Refresh 令牌获取最新的 Access 和 ID 令牌并缓存令牌并再次过期。

如果您使用我们针对 androidiosjavascript 的高级 SDK 之一,SDK 会为您管理所有这些。

【讨论】:

您好,您能否提供一些有关使用刷新令牌刷新 id 令牌的提示。 您好,您可以在此链接上找到更多信息如何使用它们。docs.aws.amazon.com/cognito/latest/developerguide/…。简而言之,使用刷新令牌调用 AdminInitiateAuth 操作。 @Chetan Mehta,iOS SDK (AWSCognitoIdentityProvider 2.6.7) 不会自动刷新令牌,这是我在 SO ***.com/q/49142054/2534233 上的帖子 @user44776 我设法解决了这个问题:在这里查看我的答案:***.com/questions/48887594/…【参考方案2】:

您可以在此链接上找到更多信息如何使用它们。http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

要使用刷新令牌获取新令牌,请使用 AdminInitiateAuth API,将 REFRESH_TOKEN_AUTH 传递给 AuthFlow 参数和刷新令牌 带有键“REFRESH_TOKEN”的 AuthParameters 参数。这启动 使用 Amazon Cognito 服务器的令牌刷新过程并返回 新的 ID 和访问令牌。

简而言之,使用刷新令牌调用 AdminInitiateAuth 操作。查看您喜欢的开发语言的 SDK。

【讨论】:

【参考方案3】:

在我的项目中,我使用 AWS Amplify 库,我发现这种方法可行:

配置:

import Amplify,  Auth  from "aws-amplify";

Amplify.configure(
  Auth: 
    userPoolId: <USER_POOL_ID>,
    userPoolWebClientId: <USER_POOL_WEB_CLIENT_ID>
  
);

刷新令牌

try 
    const currentUser = await Auth.currentAuthenticatedUser();
    const currentSession = currentUser.signInUserSession;
    currentUser.refreshSession(currentSession.refreshToken, (err, session) => 
      // do something with the new session
    );
   catch (e) 
    // whatever
  
;

更多讨论在这里:https://github.com/aws-amplify/amplify-js/issues/2560。

【讨论】:

以上是关于如何处理 Cognito 上的令牌过期问题的主要内容,如果未能解决你的问题,请参考以下文章

FBSDK令牌过期情况如何处理?

reCAPTCHA V3:空闲后如何处理过期令牌?

如何处理 Firebase 中过期的用户 ID 令牌?

如何处理 React Spa 上的刷新令牌?

如何处理 oidc 静默续订错误

Redis 面试宝典之 Redis 如何处理已经过期的数据?