【问题标题】:Access user data in AWS lambda function with custom authorizer使用自定义授权器访问 AWS lambda 函数中的用户数据
【发布时间】:2016-11-09 06:10:38
【问题描述】:

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

我在这里有什么可能性?我需要设置认知吗?还是有其他可能?

【问题讨论】:

  • 为什么用户名不够用?
  • 抱歉不够具体,但是说用户连接到一个组织,我想在某些情况下使用组织 ID 进行过滤,在其他情况下使用用户 ID,所以我需要两者都可用。

标签: node.js aws-lambda amazon-cognito aws-api-gateway


【解决方案1】:

在阅读文档时,我发现与公认答案所暗示的有所不同。也许它是新的,但现在输出不仅可以包含principalId,还可以包含“上下文”,它是一个对象。示例:

{
    "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。更好的方法。 :)

【讨论】:

    【解决方案2】:

    看来你有几个选择。

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

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

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

    【讨论】:

    • 谢谢,我将混合使用两者,构建令牌数据 / principalId(在我的例子中)“org/userId”。在少数情况下,我需要更多,我将加载用户。
    【解决方案3】:

    一种可能的方法是将数据对象从授权器 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 函数内进行解码。检查以下链接以获取更多信息。 stack overflow answer for base64 decode

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2021-11-13
      • 2022-12-09
      • 2020-12-12
      • 1970-01-01
      • 2018-05-04
      • 2019-09-29
      • 2018-07-10
      • 2018-01-28
      相关资源
      最近更新 更多