我有一个支持Cognito未经身份验证的身份的JavaScript Web应用程序。我正在试图弄清楚如何为DISABLED
未经身份验证的IdentityId识别链接的经过身份验证的IdentityId。
首先通过AWS.config.credentials.get
向未经身份验证的用户发放IdentityId。内部CognitoIdentityCredentials
正在使用getId生成新的未经身份验证的IdentityId。
let unathenticatedIdentityId;
const AWS = require('aws-sdk');
AWS.config.region = region;
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId
});
AWS.config.credentials.get(err => {
unathenticatedIdentityId = AWS.config.credentials.identityId;
});
然后,我们的用户通过amazon-cognito-identity-js
向Cognito用户池进行身份验证,未经身份验证的IdentityId将更改为与其Cognito Login关联的经过身份验证的IdentityId。未经身份验证的IdentityId会自动标记为DISABLED
,并在内部链接到经过身份验证的IdentityId。
let authenticatedIdentityId;
const { CognitoUserPool, CognitoUser, AuthenticationDetails } = require('amazon-cognito-identity-js');
const Pool = new CognitoUserPool({
UserPoolId,
ClientId,
});
const authDetails = new AuthenticationDetails({
Username,
Password,
});
const user = new CognitoUser({
Pool,
Username,
});
user.authenticateUser(authDetails, {
onSuccess: (session) => {
AWS.config.credentials.params.Logins = {
[PoolProviderName]: session.idToken.jwtToken,
};
AWS.config.credentials.expired = true;
AWS.config.credentials.refresh(err => {
authenticatedIdentityId = AWS.config.credentials.identityId;
});
},
});
我有unathenticatedIdentityId
和authenticatedIdentityId
的值,但我没有在AWS Cognito API中看到解决方法DISABLED
unauthenticatedIdentityId
已链接到authenticatedIdentityId
。相反,我没有找到识别IdentityIds链接到authenticatedIdentityId
的方法。 describeIdentity API会告诉我unauthenticatedIdentityId
为DISABLED
且没有Logins
,但它没有指向已关联的authenticatedIdentityId
。
如果仅链接/禁用unauthenticatedIdentityId
的值,我如何解析值authenticatedIdentityId
?
答案 0 :(得分:3)
我有一个使用AWS Cognito获取身份ID然后可能对其进行身份验证的应用。情况是客户端首先使用应用程序作为未经身份验证的(访客),然后使用Facebook登录,使他/她自己经过身份验证,并且AWS为经过身份验证的用户保留给定的身份ID,因为他是新用户。现在,当您退出应用程序并且其他人想要将此应用程序用作未经身份验证或甚至经过身份验证时,问题就出现了。 Cognito将错误地说禁止访问身份ID,因为它已经链接到之前用户的Facebook帐户。
Cognito移动版SDK 内置了一种方法来处理此问题。它们在使用时会缓存身份ID,这会导致您看到的问题。当您注销时,您将要清除该缓存。我不确定您使用的是哪种SDK,但在iOS中 AWSCognitoIdentityProvider.clear()和 CognitoCachingCredentialsProvider.clear() Android系统。同样,如果您使用 Cognito Sync ,则该客户端中的方法将擦除缓存的ID和同步数据。
另请查看https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication/
希望您也关注https://aws.amazon.com/blogs/mobile/using-the-amazon-cognito-credentials-provider/