API网关授权程序未被调用

3

我创建了一些Lambda函数并使用SAM部署它们。部署成功,但尝试访问端点时,我总是得到

“最初的回答”

{ message: "Unauthorized" }

即使我使用Authentication头正确发送了Bearer令牌,但当我从前端应用程序或REST客户端应用程序向端点发出请求时,我会收到未经授权的消息,并检查CloudWatch,没有执行授权函数。此外,从Lambda配置中检查Authorizer函数,我可以看到API Gateway Trigger存在错误,但不知道它的含义。我使用AWS提供的指南创建了Authorizer函数:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html#api-gateway-lambda-authorizer-lambda-function-create。以下是我的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控制台获得的截图。

测试授权人

检查API端点配置

Lambda控制台上显示的错误

最初的回答。

你可以尝试在API网关的/activity-stream路由下,打开方法请求->在授权者下拉菜单中选择其他值(无或其他授权者),然后点击保存,再次进行相同的过程并重新选择你的授权者。这样做应该会提示你重新添加权限以允许调用你的授权者函数。这在我之前是有效的。 - Tom Nijs
2个回答

2
经过大量测试不同的互联网发现的东西,当我注意到政策文件有误时,我开始有所改善:

之前

  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
        ]
      }
    ]
  };

ActionResource应该是数组。此外,我将resource变量设置为'*'而不是event.methodArn,因为在缓存授权时,策略缓存仅匹配到达的第一个端点,而对其他端点的下一次调用会导致错误:用户未被授权请求的方法

另一个更改是在template.yaml中进行的。

Resources:
  SomeAPI:
    Type: AWS::Serverless::Api
      Auth:
        DefaultAuthorizer: MyLambdaTokenAuthorizer
        AddDefaultAuthorizerToCorsPreflight: false
        Authorizers:
          MyLambdaTokenAuthorizer:
            FunctionArn: !GetAtt AuthorizerFunction.Arn
            Identity:
              Header: Authorization
              ValidationExpression: Bearer.*

使用值为falseAddDefaultAuthorizerToCorsPreflight会使预检调用(OPTIONS)不被验证,因为预检请求是由浏览器完成的,否则所有从Axios发出的调用也将失败。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接