我正在开发一个使用AWS Cognito作为身份提供者的应用程序。因此,用户在AWS Cognito Pool上进行身份验证,并获取访问令牌,访问ID和刷新令牌。 然后,用户可以向我的应用程序发出后端请求。我获得Access Token验证它,在Cognito AWS上获取用户配置文件并授权请求。
问题是,在Access令牌过期后,客户端将过期的令牌发送到后端,后端应用程序会收到错误(令牌已经过验证或未经过授权)。
如何使此工作流程有效?
我正在考虑向客户端发送令牌已过期的消息,并且客户将其刷新到Cognito池。这是正确的做法吗?
答案 0 :(得分:15)
从Cognito用户池获取访问令牌,ID和刷新令牌时,必须在本地缓存它。 Access和ID令牌有效期为1小时,应该在该时间段内尽可能多地重复使用。
这些代币是JWT代币并且在其内部保持到期时间。您可以解码JWT令牌,并将此过期与令牌一起缓存。每次访问令牌的缓存时,还要根据缓存的到期时间检查当前时间。如果已过期,请使用刷新令牌获取最新的访问和ID令牌并缓存令牌并再次到期。
如果您使用http://coliru.stacked-crooked.com/a/897573028a86e16e的Android,iOS JavaScript高级SDK,SDK会为您管理所有这些。
答案 1 :(得分:2)
您可以在此链接上找到更多信息如何使用它们。http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html。
要使用刷新令牌获取新令牌,请使用 AdminInitiateAuth API,传递REFRESH_TOKEN_AUTH theAuthFlow参数和刷新令牌 AuthParameters参数,键为“REFRESH_TOKEN”。这启动了 使用Amazon Cognito服务器进行令牌刷新过程并返回 新ID和访问令牌。
简而言之,使用刷新令牌调用AdminInitiateAuth操作。看一下您喜欢的开发语言的SDK。
答案 2 :(得分:2)
在我的项目中,我使用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。
答案 3 :(得分:0)
您需要为Amazon Cognito用户池开发自定义授权者。这将验证每个api网关。您可以在此处找到更多信息。