【问题标题】:How to get a Cognito authenticated user info in a AWS Lambda function?如何在 AWS Lambda 函数中获取经过 Cognito 身份验证的用户信息?
【发布时间】:2018-12-11 01:35:52
【问题描述】:

我正在为我的 Angular 应用程序开发一个无服务器后端。

用户使用 AWS Cognito 进行身份验证,并且可以通过 API Gateway 访问 AWS Lambda 函数(使用通过 API Gateway 控制台生成的开发工具包)。

问题:如何获取有关哪个用户正在调用 Lambda 函数的信息? Lambda 函数使用 python & boto3。

用例:我需要记录用户活动以符合 GDPR,因此我需要知道哪个用户正在调用 Lambda 函数。

【问题讨论】:

  • 您使用的是 Cognito 用户池还是联合身份?
  • 两者。我使用 userpool 作为联合身份的验证器
  • 好的,所以在 API Gateway 中您使用的是 IAM 授权方?您是否在 Lambda 事件对象中检索 Cognito ID?

标签: amazon-web-services aws-lambda aws-sdk aws-cognito


【解决方案1】:

API Gateway 最近推出了对 Cognito 用户池的支持 授权人。使用 Cognito User 配置 API 方法后 Pool Authorizer,可以在 Authorization 中传递未过期的 ID Token 标头到您的 API 方法。

如果它是您的用户池用户的有效 ID 令牌,那么您可以 使用您的 API 访问 ID Token 的所有声明 '$context.authorizer.claims'。

例如“$context.authorizer.claims.email”将返回用户的 电子邮件地址和“$context.authorizer.claims.sub”将返回给您 用户的唯一标识符。

如果 ID 令牌已过期或无效,Cognito 用户池授权者 将向调用者发送未经授权的 (401) 响应。

正如您从他们的出版物中看到的那样,您可以从授权标头的未过期 ID 令牌中获取声明。

【讨论】:

【解决方案2】:

我正在做完全相同的事情 - 使用用户池进行身份验证,然后使用 id_token 生成联合身份,我使用该身份访问 API 网关,连接到 Lambda。 lambda 的 CloudWatch 日志显示在 event.requestContext.identity 中传递的详细信息。该对象具有以下内容 -

"identity": {
        "cognitoIdentityPoolId": xxxx,
        "accountId": xxxxx,
        "cognitoIdentityId": xxxxxx,
        "caller": "xxxxxx:CognitoIdentityCredentials",
        "sourceIp": "x.x.x.x",
        "accessKey": "xxxxx",
        "cognitoAuthenticationType": "authenticated",
        "cognitoAuthenticationProvider": "********",
        "userArn": "*********",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        "user": "xxxxxx:CognitoIdentityCredentials"
    }

这是一个部分答案,因为我还没有弄清楚如何使用上述信息来获取实际登录的用户。

如果你解决了,请分享答案。

PS:这是一个 nodejs lambda

【讨论】:

猜你喜欢
  • 2020-11-04
  • 2016-01-17
  • 2019-09-13
  • 2018-03-22
  • 1970-01-01
  • 2014-10-03
  • 2020-02-16
  • 2018-02-02
  • 2017-01-02
相关资源
最近更新 更多