您好任何人都可以告诉我将AWS cognito集成到自定义(用户名/密码)和Google登录的步骤吗?我能够毫无问题地使自定义登录工作。我能够在没有任何问题的情况下配置用户池。我只是徘徊在客户端的变化。
我使用amazon-cognito-identity-js和aws-sdk包。
以下是我使用的一些代码段。这里我使用参数来决定验证器。 如果你们中的任何人能提供任何反馈,那就太好了。谢谢。
export function getAwsCredentials(userToken, type) {
let authenticator = '';
if (type == 'CUSTOM') {
authenticator = `cognito-idp.${config.cognito
.REGION}.amazonaws.com/${config.cognito.USER_POOL_ID}`;
}
else if (type == 'GOOGLE') {
authenticator = 'accounts.google.com';
}
AWS.config.update({ region: config.cognito.REGION });
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: config.cognito.IDENTITY_POOL_ID,
Logins: {
[authenticator]: userToken
}
});
return AWS.config.credentials.getPromise();
}
答案 0 :(得分:1)
对于联合身份池,您确实可以对待所有令牌。您只需更改登录地图中的[authenticator]
。
据推测,调用你的getAwsCredentials
函数的代码会知道令牌的来源,并且可以传递一个参数,就像你上面所做的那样。
我想提一下,我认为这不一定是一种可怕的方法。我可以直接传递[authenticator]
值,代替type
,但这是一个相对较小的事情。我的主要观点是可能很好让责任知道令牌来自调用代码,而不是你的被调用函数。
使用令牌
确定身份提供者当然,同样有效的方法可能需要或需要将身份提供者从令牌本身中拉出来。
当您integrate with Google directly时,您会从Google获得一个令牌,然后将其传递给Cognito(如上面的代码所示)。如果你解码令牌,你会发现
"iss": "accounts.google.com",
在某处。
同样,当您直接与用户池集成时,从用户池(稍后提供给身份池)获得的令牌包含以下内容:
"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx",
通过这种方式,您可以通过检查其令牌来了解用户的登录方式。
关于Cognito Hosted UI的说明
如果您使用Cognito的托管用户界面登录Google,您将从Cognito获得access_token
和id_token
(通过重定向)。在这种情况下,所有令牌都来自相同的位置(Cognito),这意味着您无法依赖任何调用代码来了解真实身份的身份提供者是。
在这种情况下,如果您的应用程序关心IDP是谁,您必须打开令牌。 id_token
的这部分是你可能会追求的:
"identities": [
{
"userId": "100000000000000000000",
"providerName": "Google",
"providerType": "Google",
"issuer": null,
"primary": "true",
"dateCreated": "1507749926267"
}
],
"token_use": "id",
"auth_time": 1509303233,
"name": "Your User",
"exp": 1509306833,
"iat": 1509303233,
"email": "youruser@gmail.com"