我有一个典型的AWS设置,将API Gateway与Cognito用户池身份验证结合使用,并与Lambda函数集成在一起。

一切正常,但是现在我需要能够在Lambda中获取经过身份验证的用户ID。

我在SO上看到了很多关于此的问题/答案,但是没有一个问题/答案有助于完成这项工作。最接近的是this answer,它链接到this documentation

从上面的这些链接中,我了解到我应该访问映射模板上的“$ context.authorizer.claims”某些属性以获取用户ID,但找不到可用属性的列表或应使用的属性。

我也尝试使用“$ context.authorizer.principalId”,但这只会返回一个空字符串。

我目前正在使用API​​网关“方法请求通过”映射模板,但是到目前为止,已经尝试了许多不同的映射模板。

我在这里想念或做错了什么?

请让我知道是否需要任何进一步的信息。

最佳答案

我建议使用Lambda Proxy Integration。在这种情况下,您的Lambda收到的事件如下所示:

{
...
  "requestContext": {
      "resourceId": "...",
      "authorizer": {
          "claims": {
              "sub": "<COGNITO SUB>",
              "iss": "...",
              "cognito:username": "<COGNITO USERNAME>",
              "aud": "...",
              "token_use": "id",
              "auth_time": "...",
              "exp": "...",
              "iat": "..."
              ...
          }
      },
      ...
  }
  ...
}
sub位于event.requestContext.authorizer.claims.sub,用户名位于event.requestContext.authorizer.claims['cognito:username']

如果使用映射模板,则可以执行以下操作:
{
  "sub": "$context.authorizer.claims.sub",
  "username": "$context.authorizer.claims["cognito:username"]"
}

08-07 22:12