我正在使用自定义身份验证(使用自定义授权程序)来访问AWS lambda。授权过程正常。但是我在授权者lambda和业务lambda之间传输数据(ex principalId)时遇到了问题。我所有的lambdas都是用JS开发的。 正如AWS doc中的解释,在授权器lambda中,我在Auth响应的上下文字段中添加了几个简单的字段(下面的代码中的principalId)。但在我的业务lambda中,我无法获得这些领域。 AWS文档讨论了$ context变量。
首先,如果 $ context 变量是另一个变量或与JS函数参数中收到的 context 变量相同的变量,您能解释一下吗?
第二,你能解释一下如何让我的业务lambda获得授权人提供的数据字段(例如:principalId)吗?
的Seb
答案 0 :(得分:2)
我猜您引用的$context
变量是API网关映射模板中可用的变量。它不等同于业务Lambda的context
参数。
但是,使用映射模板及其$context
变量,您可以构建业务Lambda的event
参数。
如果API端点的映射模板如下所示:
{
"principalId" : "$context.authorizer.principalId"
}
您应该检索Lambda的principalId
参数中的event
。
使用 passthrough 选项,principalId
中应该有event.context['authorizer-principal-id']
。这是创建端点时的默认行为。
有关doc:
中的映射模板的参考资料答案 1 :(得分:1)
授权者的策略文档可以使用可放入自定义数据的上下文进行充实。该数据将通过该事件提供给企业lambda。
以下是政策文件的示例:
const policy = {
context: {
customKey: 'payload data',
},
policyDocument: {
Statement: [{
Action: 'execute-api:Invoke',
Effect: effect,
Resource: resource,
}],
Version: '2012-10-17',
},
principalId: sub,
};
上下文包含带有负载数据作为字符串的“ customKey”。
您的API的映射模板应如下所示:
{
"customKey": "$context.authorizer.customKey"
}
最后,您可以在事件中通过事件访问customKey的值:
exports.handler = async (event, context) => {
console.log(event.customKey);
.
.
.
};
根据我的示例,这应该记录“ customValue”。
请注意,您无法根据documentation
将JSON对象或数组设置为上下文映射中任何键的有效值。答案 2 :(得分:0)
除了Alexis的回答,principalId - 目前是唯一可以从自定义授权器传递给Lambda的param(截至今天)。但是,传递自定义参数的解决方法是将JSON参数字符串化为principleId。关于这个问题的讨论是here
答案 3 :(得分:0)
AWS APIGateway 在 API 定义中有以下标签。
1. End point name, method type
2. parameters
3. responses
4. x-amazon-apigateway-integration => under this "requestParameters" will be populatested with mapping data or any data with key value pair.
link 肯定会帮助您。