我有一个nodeJS lambda函数,它返回数据库数据,我想根据用户过滤该数据。我创建了一个自定义授权器lambda函数,它为用户提供了一个JWT令牌,但是我找不到将数据从授权器函数传递到数据库函数的方法,除了principalId(user.id)。
我有什么可能性?我需要设置cognito吗?还是有另一种可能吗?
答案 0 :(得分:3)
在阅读文档时,我发现了与接受的答案所暗示的不同之处。也许它是新的,但现在输出不仅包括principalId
,还包括" context&#34 ;,这是一个对象。样品:
{
"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。更好的方法。 :)
答案 1 :(得分:1)
看来你有几个选择。
1 )您可以将有关所需用户的所有信息放入自定义授权程序功能中设置的主体ID中。因此,也许您可以将用户序列化为json,或者如果您只需要几个ID,则可以将它们与特殊字符(例如principalId: "userId|organizationId"
)连接在一起。我相信API Gateway会对返回的主体ID做一些缓存,所以我不会做任何高度动态的事情。您也可以关闭缓存以进行授权,但结果会减慢该端点的速度。
2 )只需传递用户ID并再次执行用户查找,即可获取执行数据库调用的函数中的所有信息。如果您正在使用DynamoDB,那么它应该很快。
Cognito看起来不错,但我认为它不会帮助你解决你现在遇到的特殊问题。如果是我,虽然我会选择 2 选项。
答案 2 :(得分:1)
一种可能的方法是将数据对象从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);
解码可以在两个地方完成,一个地方是请求模板部分。这可以通过在速度脚本中编写转换来完成,如下所示
{
"requestTemplate": {
"application/json": {
"principal": "$util.urlEncode($util.base64Decode($context.authorizer.principalId))"
}
}
}
其他选项是使用nodejs Base64解码在端点lambda函数内进行解码。有关更多信息,请查看以下链接。 stack overflow answer for base64 decode