Node.js 如何将API网关授权器上下文传递到HTTP集成
我已经成功地为我的AWS API网关实现了Lambda授权程序,但我想将一些自定义属性从它传递到Node.js端点 我的授权人的输出遵循AWS指定的格式,如下所示Node.js 如何将API网关授权器上下文传递到HTTP集成,node.js,amazon-web-services,lambda,aws-api-gateway,Node.js,Amazon Web Services,Lambda,Aws Api Gateway,我已经成功地为我的AWS API网关实现了Lambda授权程序,但我想将一些自定义属性从它传递到Node.js端点 我的授权人的输出遵循AWS指定的格式,如下所示 { "principalId": "yyyyyyyy", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "
{
"principalId": "yyyyyyyy",
"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": {
"company_id": "123",
...
}
}
但是,只有在将Lambda选择为集成类型的情况下,主体映射模板才在集成请求下可用。如果选择了HTTP,则不会
简而言之,如何将公司id从我的Lambda授权人传递到我的节点API?如果您使用的是
lamda代理
,您可以从事件.requestContext.authorizer.context
访问上下文
因此,您的
company\u id
可以使用event.requestContext.authorizer.context.company\u id在对我的问题的评论中,大部分归功于@Michael sqlbot,但是如果其他人发现这个问题,我会在这里给出完整的答案
{
"principalId": "yyyyyyyy",
"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": {
"company_id": "123", <-- The part you want to forward
...
}
}
授权人Lambda
它必须以这种格式返回一个对象,其中上下文包含要转发到端点的参数,如问题中所指定的
{
"principalId": "yyyyyyyy",
"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": {
"company_id": "123", <-- The part you want to forward
...
}
}
{
“principalId”:“YYYYYY”,
“政策文件”:{
“版本”:“2012-10-17”,
“声明”:[{
“操作”:“执行api:Invoke”,
“效果”:“允许|拒绝”,
“资源”:“arn:aws:执行api:://[/[…]”
}]
},
“背景”:{
“company_id:”123“,此方案有效吗?我遵循了确切的步骤,但是“端点请求头”没有授权人在上下文映射中填充的内容。不要使用lambda代理,如果可能的话,我希望避免使用它。奇怪的是,如果我使用正常的lambda集成,$context.Authorizer
为空,因此我找不到通过主体映射将该信息传递给lambda的方法。我正在api GW中使用REST api,并使用cognito作为授权人。你应该得到很多啤酒……把这些值放到HTTP请求头中怎么样?@Michael sqlbot这正是我想做的。头、url或正文并不重要。任何事情都可以。问题是如何做到这一点?在集成请求中创建头,然后指定,例如contentxt.identity.which
一开始没有$
的。我没有使用自定义授权程序,但这对我访问上下文对象中的其他内容并将它们放入转发到源站的头中非常有效……例如,我尝试了context.stage
和context.apid
,它们都作为exp转发CTE,作为HTTP头。试试看?另外,“使用HTTP代理集成”选项的名称似乎非常糟糕。如果要使用请求正文映射模板…只需取消选中该选项。该选项似乎实际上意味着“你知道吗?别挡我的路,按原样代理请求,不管它是什么,这样我就可以避免弄乱身体映射模板。"您可以在选中或不选中该选项的情况下将请求代理到后端。@Michael sqlbot谢谢您Michael!在您的回答和aws支持的帮助下,终于让它正常工作了。我需要将context.authorizer.company_id
设置为Integration request下的HTTP头,将company_id
设置为Method下的HTTP请求头执行。我认为这是AWS服务集成中一个强大的未记录(至少帮助中没有列出)功能。我认为在“方法请求”中添加头不需要。非常感谢。为我节省了很多时间。正如@Rich所说,“方法请求”中不需要标题@Magnus Engdal-感谢您花时间记录完整的答案。它对我起了作用。您最终成功了吗?我按照步骤进行了操作,但我不断看到event.headers==undefined
Ok。在将API部署到一个阶段之后,它就开始工作了!