注销时使 AWS Cognito 令牌无效
Invalidate AWS Cognoto token at logout
我正在使用 Python 后端构建 Swift 应用程序,我想使用 AWS Cognoto 进行身份验证和注册流程。
目前,我正在使用以下代码登录
let user = pool?.getUser(email)
user?.getSession(email, password: password, validationData: nil)
.continueWith { task in
// handle error/success
return nil
}
池已在上面初始化,使用 self.pool = AWSCognitoIdentityUserPool.default()
调用。
在应用程序启动时,我正在检查用户是否已通过身份验证,并获取 access_token:
if AWSSignInManager.sharedInstance().isLoggedIn {
if let user = pool?.currentUser() {
user.getSession()
.continueWith { task in
token = task.result?.accessToken?.tokenString
return nil
}
}
}
我正在将此令牌传递给后端。在后端,我通过 Python 保证库获取用户数据:
from warrant import Cognito
u = Cognito("id", "key", user_pool_region="us-east-1")
u.access_token = "token"
res = u.get_user(attr_map={"sub": "user_id", "email": "email"})
如果令牌有效,我将获取用户数据,否则会引发异常。但是在客户端注销后,这个令牌仍然存在。我正在使用以下注销代码:
AWSSignInManager.sharedInstance().logout { (result: Any?, error: Error?) in
// handle results
}
我明白,这个令牌将在超时后过期,并且不会被刷新,因为下一次登录用户将获得另一个 accces/refresh 令牌对,但我想立即使令牌无效注销,这可能吗?或者我不了解 Cognito 并使用不正确?
在搜索 github 和 AWS 论坛后,我找到了 chris radek 对这个问题的(半)回答,他是 aws-sdk for js 的贡献者。
这是讨论:
https://github.com/aws/aws-sdk-js/issues/1241
如果您不想全部阅读,基本上,chris 说令牌的标准有效期为一个小时,但是
by modifying a certain parameter you can cut that down to a minimum of
15 minutes. You cannot, however, invalidate a token immediately on
signout.
以下是 javascript 描述如何缩短持续时间的文档:
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html#params-property
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/STS.html#assumeRoleWithWebIdentity-property
关于该主题的 AWS 文档:
https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html
https://forums.aws.amazon.com/thread.jspa?threadID=232652
这里是可以在python中调用的匹配函数:
https://boto3.readthedocs.io/en/latest/reference/services/cognito-identity.html#CognitoIdentity.Client.get_open_id_token_for_developer_identity
这是可以更改令牌持续时间的地方!
我正在使用 Python 后端构建 Swift 应用程序,我想使用 AWS Cognoto 进行身份验证和注册流程。
目前,我正在使用以下代码登录
let user = pool?.getUser(email)
user?.getSession(email, password: password, validationData: nil)
.continueWith { task in
// handle error/success
return nil
}
池已在上面初始化,使用 self.pool = AWSCognitoIdentityUserPool.default()
调用。
在应用程序启动时,我正在检查用户是否已通过身份验证,并获取 access_token:
if AWSSignInManager.sharedInstance().isLoggedIn {
if let user = pool?.currentUser() {
user.getSession()
.continueWith { task in
token = task.result?.accessToken?.tokenString
return nil
}
}
}
我正在将此令牌传递给后端。在后端,我通过 Python 保证库获取用户数据:
from warrant import Cognito
u = Cognito("id", "key", user_pool_region="us-east-1")
u.access_token = "token"
res = u.get_user(attr_map={"sub": "user_id", "email": "email"})
如果令牌有效,我将获取用户数据,否则会引发异常。但是在客户端注销后,这个令牌仍然存在。我正在使用以下注销代码:
AWSSignInManager.sharedInstance().logout { (result: Any?, error: Error?) in
// handle results
}
我明白,这个令牌将在超时后过期,并且不会被刷新,因为下一次登录用户将获得另一个 accces/refresh 令牌对,但我想立即使令牌无效注销,这可能吗?或者我不了解 Cognito 并使用不正确?
在搜索 github 和 AWS 论坛后,我找到了 chris radek 对这个问题的(半)回答,他是 aws-sdk for js 的贡献者。
这是讨论: https://github.com/aws/aws-sdk-js/issues/1241
如果您不想全部阅读,基本上,chris 说令牌的标准有效期为一个小时,但是
by modifying a certain parameter you can cut that down to a minimum of 15 minutes. You cannot, however, invalidate a token immediately on signout.
以下是 javascript 描述如何缩短持续时间的文档: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html#params-property
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/STS.html#assumeRoleWithWebIdentity-property
关于该主题的 AWS 文档: https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html
https://forums.aws.amazon.com/thread.jspa?threadID=232652
这里是可以在python中调用的匹配函数: https://boto3.readthedocs.io/en/latest/reference/services/cognito-identity.html#CognitoIdentity.Client.get_open_id_token_for_developer_identity
这是可以更改令牌持续时间的地方!