6

我有一个使用 AWS javascript SDK 的 Angular 应用程序,并且可以使用 Facebook 和 Google 成功登录。我能够创建 Cognito 身份,并且在我的联合身份池中看到了该身份。我还可以使用经过 IAM 身份验证的 API 端点(我在调用的 Lambda 中看到了用户的 cognitoId)。

我想使用用户的电子邮件地址作为数据库(DynamoDB)中的密钥,因此我试图弄清楚如何从可信来源(Cognito(首选)或身份验证提供者的 JWT)访问用户的电子邮件地址。

访问用户电子邮件地址的最佳方式是什么?

更新:在客户端(javascript)我使用联合身份与谷歌和 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())了 ,但详细信息包括用户名和密码(不是联合登录)。

4

1 回答 1

10

tldr ; 将 accessToken post-authentication 发送到 lambda 并使用 CognitoIdentityServiceProvider.getUser() 获取属性。

我花了几个小时摸索 ID 令牌,据我所知,获取用户实际身份的唯一方法是使用成功身份验证提供的 accessToken 和身份提供者的getUser调用的组合。这似乎仅适用于 NodeJS SDK,仅此而已。

我在后台为我的应用程序和 Lambda 使用 Amazon 的 API 网关。成功验证后,您可以访问 accessToken 并将其提供给 Cognito 服务器提供商。从那里,您可以在本地保存详细信息,但如果您打算在后端使用此信息,则会出现很大的安全问题。由于它是本地存储,因此用户可以将用户属性调整为他们喜欢的任何内容。

为了解决这个问题,您可以将 accessToken 直接传递给 lambda 函数并在服务器上执行相同的过程。这样做可以确保用户属性没有被操纵或篡改。请务必在您的 API 上使用 HTTPS,以避免将 accessToken 泄露给可能使用 AWS 开发工具包获取内部详细信息的其他人。

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
    });
  });
};

于 2016-12-31T23:26:12.317 回答