Amazon web services 未调用API网关授权程序
我已经创建了一些Lambda函数,并使用SAM进行了部署。部署是成功的,但当尝试到达端点时,我总是能够获得Amazon web services 未调用API网关授权程序,amazon-web-services,aws-lambda,authorization,aws-api-gateway,Amazon Web Services,Aws Lambda,Authorization,Aws Api Gateway,我已经创建了一些Lambda函数,并使用SAM进行了部署。部署是成功的,但当尝试到达端点时,我总是能够获得 { message: "Unauthorized" } 甚至我也在使用身份验证头发送正确的承载令牌。 然后,如果我去授权人处运行测试,它会顺利通过并在CloudWatch中生成日志,但当我运行从前端应用程序或REST客户端应用程序到端点的请求时,我会收到未经授权的消息并检查CloudWatch,授权人功能不会执行 此外,通过Lambda配置检查Authorizer函数,我可以看到API网
{ message: "Unauthorized" }
甚至我也在使用身份验证头发送正确的承载令牌。
然后,如果我去授权人处运行测试,它会顺利通过并在CloudWatch中生成日志,但当我运行从前端应用程序或REST客户端应用程序到端点的请求时,我会收到未经授权的消息并检查CloudWatch,授权人功能不会执行
此外,通过Lambda配置检查Authorizer函数,我可以看到API网关触发器中有一个错误,但我不知道这是什么意思
我使用AWS提供的指南创建了授权人功能:
共享我的SAM配置
Resources:
SomeAPI:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
TracingEnabled: true
Auth:
DefaultAuthorizer: MyLambdaTokenAuthorizer
Authorizers:
MyLambdaTokenAuthorizer:
FunctionArn: !GetAtt AuthorizerFunction.Arn
GetActivityStreamFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: get-activity-stream/
Handler: index.handler
Layers:
- !Ref DepencenciesLayer
- !Ref DatabaseLayer
Events:
GetActivityStream:
Type: Api
Properties:
RestApiId: !Ref SomeAPI
Path: /activity-stream
Method: get
## Authorizer Function
AuthorizerFunction:
Type: AWS::Serverless::Function
Properties:
Layers:
- !Ref DepencenciesLayer
CodeUri: authorizer/
Handler: index.handler
对于授权人返回的响应,它发送API网关请求的所有参数
{
principalId: decoded.sub,
policyDocument: getPolicyDocument("Allow", params.methodArn),
context: { scope: decoded.scope }
}
我使用的运行时是nodejs12.x
,下面是我从AWS控制台获得的一些屏幕截图
在花了很多时间测试互联网上发现的不同东西后,当我注意到政策文件错误时,我开始有所改进:
之前
const policyDocument = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": effect,
"Action": "execute-api:Invoke",
"Resource": resource
}
]
};
之后
const policyDocument = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": effect,
"Action": [
"execute-api:Invoke"
],
"Resource": [
resource
]
}
]
};
其中Action
和Resource
应该是数组。我还将资源
变量设置为'*'
,而不是事件.methodArn
,因为在缓存授权时,缓存的策略只匹配到达的第一个端点,而对其他端点的下一次调用会导致错误:用户未授权使用请求的方法
另一个变化是在模板中.yaml
Resources:
SomeAPI:
Type: AWS::Serverless::Api
Auth:
DefaultAuthorizer: MyLambdaTokenAuthorizer
AddDefaultAuthorizerToCorsPreflight: false
Authorizers:
MyLambdaTokenAuthorizer:
FunctionArn: !GetAtt AuthorizerFunction.Arn
Identity:
Header: Authorization
ValidationExpression: Bearer.*
addDefaultAuthorizatorToCorsPreflight
withfalse
值使飞行前调用(OPTIONS
)不被验证,因为飞行前请求是由浏览器完成的,否则来自Axios
的所有调用也会失败。我也有同样的想法。
如果没有调用授权人Lambda,我认为这是因为auth被缓存了,或者配置认为请求中没有标识材料
查看设置:只有某些标题被视为包含标识材料,并且它们被用作缓存密钥您是否可以尝试在/activity stream路由下的API gateway中打开方法请求->在authorizer下拉列表中:选择任何其他值(none或其他authorizer)并点击save,然后执行相同的过程并重新选择授权人。它应该提示您,它将重新添加允许调用授权人功能的权限。这以前对我很有效。