首页 文章

如何在node.js AWS Lambda中获取经过身份验证的用户的电子邮件地址?

提问于
浏览
4

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

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

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

Update: 在客户端(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()) ,但详细信息包括用户名和密码(不是联合登录) .

1 回答

  • 8

    tldr ;将accessToken后验证发送到lambda并使用CognitoIdentityServiceProvider.getUser()来获取属性 .

    我花了几个小时摸索ID令牌,据我所知,获得用户实际身份的唯一方法是使用成功身份验证提供的accessToken和身份提供商的getUser呼叫的组合 . 这似乎只适用于NodeJS SDK而不是其他任何内容 .

    我在我的应用程序中使用亚马逊的API网关,在后台使用Lambda . 身份验证成功后,您可以访问accessToken并将其提供给Cognito服务器提供商 . From there, you can save the details locally, but it presents a large security issue if you plan to use this information on the backend . 由于它是本地存储,因此用户可以将用户属性调整为他们喜欢的任何内容 .

    要解决此问题,您可以直接将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
        });
      });
    };
    

相关问题