Node.js 使用自定义授权程序访问AWS lambda函数中的用户数据

Node.js 使用自定义授权程序访问AWS lambda函数中的用户数据,node.js,aws-lambda,amazon-cognito,aws-api-gateway,Node.js,Aws Lambda,Amazon Cognito,Aws Api Gateway,我得到了一个nodejslambda函数,它返回数据库数据,我想根据用户过滤数据。我创建了一个定制的authorizer lambda函数,用于获取JWT令牌的用户,但除了principalId(user.id)之外,我找不到将数据从authorizer函数传递到数据库函数的方法 我这里有什么可能性?我需要设置cognito吗?或者还有其他可能性吗?看来你有两种选择 1)您可以将所需用户的所有信息放入自定义授权人功能中设置的主体id中。因此,也许您可以将用户序列化为json,或者如果您只需要几个

我得到了一个nodejslambda函数,它返回数据库数据,我想根据用户过滤数据。我创建了一个定制的authorizer lambda函数,用于获取JWT令牌的用户,但除了principalId(user.id)之外,我找不到将数据从authorizer函数传递到数据库函数的方法


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

看来你有两种选择

1)您可以将所需用户的所有信息放入自定义授权人功能中设置的主体id中。因此,也许您可以将用户序列化为json,或者如果您只需要几个ID,则可以使用特殊字符将它们连接在一起,如:
principalId:“userId | organizationId”
。我相信API网关会对返回的主体id进行缓存,所以我不会让它成为任何高度动态的东西。您还可以关闭授权缓存,但这样会减慢端点的速度

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


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

似乎你有两个选择

1)您可以将所需用户的所有信息放入自定义授权人功能中设置的主体id中。因此,也许您可以将用户序列化为json,或者如果您只需要几个ID,则可以使用特殊字符将它们连接在一起,如:
principalId:“userId | organizationId”
。我相信API网关会对返回的主体id进行缓存,所以我不会让它成为任何高度动态的东西。您还可以关闭授权缓存,但这样会减慢端点的速度

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


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

,一种可能的方法是将数据对象从authorizer 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);
解码可以在两个地方进行,一个地方是请求模板部分。这可以通过在velocity脚本中编写转换来完成,如下所示

{
      "requestTemplate": {
        "application/json": {
          "principal": "$util.urlEncode($util.base64Decode($context.authorizer.principalId))"
        }
      }
 }
另一个选项是使用nodejs Base64解码在端点lambda函数内部进行解码。有关更多信息,请查看以下链接。

一种可能的方法是将数据对象从authorizer 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);
解码可以在两个地方进行,一个地方是请求模板部分。这可以通过在velocity脚本中编写转换来完成,如下所示

{
      "requestTemplate": {
        "application/json": {
          "principal": "$util.urlEncode($util.base64Decode($context.authorizer.principalId))"
        }
      }
 }
另一个选项是使用nodejs Base64解码在端点lambda函数内部进行解码。有关更多信息,请查看以下链接。

在阅读文档时,我发现了一些与公认答案不同的东西。也许它是新的,但现在输出不仅可以包括
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
    }
}
{
“principalId”:“xxxxxxxx”,//与客户端发送的令牌关联的主要用户标识。
“政策文件”:{
“版本”:“2012-10-17”,
“声明”:[
{
“操作”:“执行api:Invoke”,
“效果”:“允许|拒绝”,

“资源”:“arn:aws:execute api::。更好的解释是:”

在阅读文档时,我发现了一些与公认答案建议不同的东西。可能是新的,但现在输出不仅可以包括
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
    }
}
{
“principalId”:“xxxxxxxx”,//与客户端发送的令牌关联的主要用户标识。
“政策文件”:{
“版本”:“2012-10-17”,
“声明”:[
{
“操作”:“执行api:Invoke”,
“效果”:“允许|拒绝”,

“资源”:arn:aws:execute api::。更好的解释是:)

为什么用户id不够具体?很抱歉,如果用户连接到一个组织,我想在某些情况下使用组织id进行过滤,在其他情况下使用用户id,因此我需要两者都可用。为什么用户id不够具体?很抱歉,没有具体说明fic够了,但是假设用户连接到一个组织,我想在某些情况下使用组织id进行过滤,在其他情况下使用用户id,因此我需要两者都可用。谢谢,我将混合使用这两种方法,构建令牌数据/principalId(在我的情况下是)“org/userId”。在少数情况下,我需要更多,我将加载用户。谢谢,我将混合使用这两种方法,构造令牌数据/principalId(在我的情况下为“org/userId”)。在少数情况下,我需要更多,我将加载用户。