使用自定义授权方访问 AWS lambda 函数中的用户数据

Access user data in AWS lambda function with custom authorizer

我有一个 nodeJS lambda 函数,其中 returns 数据库数据,我想根据用户过滤该数据。我创建了一个自定义授权器 lambda 函数,它为 JWT 令牌获取用户,但我找不到将数据从授权器函数传递到数据库函数的方法,除了 principalId (user.id).

我在这里有什么可能性?我需要设置 cognito 吗?或者还有其他的可能吗?

看来你有几个选择。

1) 您可以将您需要的有关用户的所有信息放入自定义授权函数中设置的主体 ID 中。因此,也许您可​​以将用户序列化为 json,或者如果您只需要几个 ID,然后将它们与特殊字符连接在一起,例如:principalId: "userId|organizationId"。我相信 API Gateway 围绕返回的主体 ID 做了一些缓存,所以我不会让它成为任何可能高度动态的东西。您也可以关闭授权缓存,但这会降低端点的速度。

2) 只需传递用户 ID 并再次进行用户查找,以获取执行数据库调用的函数中的所有信息。如果您使用的是 DynamoDB,据说它会很快。

Cognito 看起来不错,但我认为它不会帮助您解决您现在遇到的特定问题。如果是我,我会选择 2.

一种可能的方法是从授权方 lambda 函数将数据对象编码为 base64 字符串,然后将其解码。

 var principalId = new Buffer(JSON.stringify({
   id: 5,
   name: "John"
 })).toString('base64');

 var policy = require('./policy.json');

 var policyConfig = {
   "principalId": principalId,
   "policyDocument": policy
 };

 context.succeed(policyConfig);

解码可以在两个地方完成,一个地方是请求模板部分。这可以通过在速度脚本中编写一个转换来完成,如下所示

{
      "requestTemplate": {
        "application/json": {
          "principal": "$util.urlEncode($util.base64Decode($context.authorizer.principalId))"
        }
      }
 }

其他选项是使用 nodejs Base64 解码在端点 lambda 函数内部进行解码。查看以下 link 了解更多信息。 stack overflow answer for base64 decode

在阅读文档时,我发现了一些与公认的答案不同的地方。也许它是新的,但现在输出不仅可以包含 principalId,还可以包含 "context",这是一个对象。示例:

{
    "principalId": "xxxxxxxx", // The principal user identification associated with the token send by the client.
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow|Deny",
                "Resource": "arn:aws:execute-api:<regionId>:<accountId>:<appId>/<stage>/<httpVerb>/[<resource>/<httpVerb>/[...]]"
            }
        ]
    },
    "context": {
        "key": "value",
        "numKey": 1,
        "boolKey": true
    }
}

更多来自官方文档here。更好的方法。 :)