我有一个使用AWS javascript SDK的Angular应用程序,可以使用Facebook和Google成功登录。我能够创建Cognito身份,并在联合身份池中看到身份。我也可以使用我的IAM认证API端点(我在Lambda中看到用户的认知)。
我想将用户的电子邮件地址用作数据库中的密钥(DynamoDB),因此我试图弄清楚如何从受信任的来源(Cognito(首选)或身份验证提供商的JWT)访问用户的电子邮件地址
访问用户电子邮件地址的最佳方式是什么?
更新:在客户端(javascript)我正在使用Google和Facebook令牌的联合身份。社交登录正在运行,我可以使用Cognito进行身份验证,通过登录:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:****',
Logins: {
'accounts.google.com': authResult['id_token']
}
});
然后我做了AWS.config.credentials.get()
我可以得到像AWS.config.credentials.identityId
这样的东西,但我找不到accessToken或者调用JWT的方法。我相信我需要致电result.getAccessToken().getJwtToken()
,但我找不到它。
他们获取accessToken的所有示例似乎都使用.authenticateUser(authenticationDetails())
,但详细信息包括用户名和密码(不是联合登录)。
答案 0 :(得分:8)
<强> tldr 强>;将accessToken后验证发送到lambda并使用CognitoIdentityServiceProvider.getUser()来获取属性。
我花了好几个小时摸索ID令牌,据我所知,获得用户实际身份的唯一方法是使用成功身份验证提供的accessToken和来自getUser的{{3}}来电的组合身份提供者。这似乎只适用于NodeJS SDK而不是其他任何内容。
我在我的应用程序中使用亚马逊的API网关,在后台使用Lambda。身份验证成功后,您可以访问accessToken并将其提供给Cognito服务器提供商。 从那里,您可以在本地保存详细信息,但如果您计划在后端使用此信息,则会出现很大的安全问题。由于它是本地存储,因此用户可以将用户属性调整为他们喜欢的任何内容。
要解决此问题,您可以直接将accessToken传递给lambda函数,并在服务器上执行相同的过程。这样做可确保用户属性未被操纵或篡改。请务必在API上使用HTTPS,以避免将accessToken泄露给可能使用AWS SDK获取内部详细信息的其他人。
var AWS = require("aws-sdk");
AWS.config.region = '<REGION-ID>';
exports.lambda_handler = function(event, context) {
var accessToken = event['accessToken'];
var provider = new AWS.CognitoIdentityServiceProvider();
provider.getUser({
AccessToken: accessToken
}, function(err, obj) {
context.succeed({
'user': obj
});
});
};