Node.js 使用自定义授权程序访问AWS lambda函数中的用户数据
我得到了一个nodejslambda函数,它返回数据库数据,我想根据用户过滤数据。我创建了一个定制的authorizer lambda函数,用于获取JWT令牌的用户,但除了principalId(user.id)之外,我找不到将数据从authorizer函数传递到数据库函数的方法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,或者如果您只需要几个
我这里有什么可能性?我需要设置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”)。在少数情况下,我需要更多,我将加载用户。