Amazon web services 未调用API网关授权程序

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网

我已经创建了一些Lambda函数,并使用SAM进行了部署。部署是成功的,但当尝试到达端点时,我总是能够获得

{ 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
with
false
值使飞行前调用(
OPTIONS
)不被验证,因为飞行前请求是由浏览器完成的,否则来自
Axios
的所有调用也会失败。

我也有同样的想法。 如果没有调用授权人Lambda,我认为这是因为auth被缓存了,或者配置认为请求中没有标识材料


查看设置:只有某些标题被视为包含标识材料,并且它们被用作缓存密钥

您是否可以尝试在/activity stream路由下的API gateway中打开方法请求->在authorizer下拉列表中:选择任何其他值(none或其他authorizer)并点击save,然后执行相同的过程并重新选择授权人。它应该提示您,它将重新添加允许调用授权人功能的权限。这以前对我很有效。