从API网关自定义授权器返回401缺少"Access-Control-Allow-Origin"标头

han*_*bzu 42 amazon-web-services cors aws-lambda aws-api-gateway

为了防止未登录的用户通过AWS API网关调用我的lambda函数,我使用的是Custom Authorizer lambda解决方案.

如果请求被授权(200)并且我从被叫lambda得到响应,一切正常,我得到了Access-Control-Allow-Origin标题.

但是,如果该请求没有被授权,我得到一个401一个没有Access-Control-Allow-Origin头,所以阻止我读响应的401个状态和将用户重定向到登录页面.

我相信这是因为自定义自动化机制不知道请求需要使用CORS.有谁知道这实际上是问题吗?你知道任何可能的解决方案吗?

Bob*_*ney 18

我很高兴地宣布新的网关响应功能,该功能允许您自定义不会调用您的集成的请求的错误响应.这允许您确保包含CORS头,即使在失败的身份验证请求中也是如此.

阅读我们的文档,其中包括一个CORS示例.

  • 这里你需要什么:http://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-gateway-responses-in-swagger.html?shortFooter=true (2认同)
  • 如果您正在使用 serverless.yaml,这就是您需要了解的内容 https://github.com/serverless/examples/blob/master/aws-node-auth0-custom-authorizers-api/serverless.yml# L33 (2认同)

Lor*_*ara 15

是的,这是API Gateway自定义授权程序的已知错误.谢谢让我们注意到这个.我们部署修复程序后,团队将更新此帖子.不便之处敬请原谅.

  • 任何更新?似乎标题仍未发送. (7认同)
  • 是的,这仍然是一个问题,考虑到它已经存在多久,这是非常荒谬的.像这样的事情使API网关不能生产就绪,最糟糕的是,在你投入大量资金之前,你不会发现它. (4认同)
  • 在这里遇到同样的问题.更新会很棒 (3认同)
  • AWS团队,我们可以做些什么来帮助?我们在很大程度上依赖于自定义授权者lambdas,这些问题在我们的用户中造成了很多烦恼和混乱. (2认同)

小智 7

解决所有4XX错误(包括401错误)的最简单方法是转到"网关响应",然后选择"默认4XX",然后添加标题"Access-Control-Allow-Origin",其值为'*".

看截图:


dan*_*rez 6

这对我有用(在 AWS::APIGateway 中内联:定义)

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Dev
      GatewayResponses:
        UNAUTHORIZED:
          StatusCode: 401
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"
        ACCESS_DENIED:
          StatusCode: 403
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"
        DEFAULT_5XX:
          StatusCode: 500
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"
        RESOURCE_NOT_FOUND:
          StatusCode: 404
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"  
Run Code Online (Sandbox Code Playgroud)

可用的网关响应命名是:

DEFAULT_INTERNAL
DEFAULT_4XX
DEFAULT_5XX
RESOURCE_NOT_FOUND
UNAUTHORIZED
ACCESS_DENIED
AUTHORIZER_FAILURE
AUTHORIZER_CONFIGURATION_ERROR
MISSING_AUTHENTICATION_TOKEN
INVALID_SIGNATURE
EXPIRED_TOKEN
INTEGRATION_FAILURE
INTEGRATION_TIMEOUT
API_CONFIGURATION_ERROR
UNSUPPORTED_MEDIA_TYPE
REQUEST_TOO_LARGE
BAD_REQUEST_PARAMETERS
BAD_REQUEST_BODY
THROTTLED
QUOTA_EXCEEDED
INVALID_API_KEY
WAF_FILTERED
Run Code Online (Sandbox Code Playgroud)

因此,您可以为这些受控 AWS 响应指定响应自定义。


pis*_*ado 5

因为我花了一段时间才弄清楚如何在 Cloud Formation 中将它们组合在一起,所以这里有一个片段展示了如何设置它。

...
    MyApi:
      Type: "AWS::ApiGateway::MyApi"
      Properties:
        Description: My API
        Name: "my-api"
    MyApiAuthorizer:
      Type: "AWS::ApiGateway::Authorizer"
      Properties:
         Name: "my-api-authorizer"
         IdentitySource: "method.request.header.Authorization"
         ProviderARNs:
           - !GetAtt MyUserPool.Arn
         RestApiId: !Ref MyAApi
         Type: COGNITO_USER_POOLS
    MyApiGatewayResponse:
      Type: "AWS::ApiGateway::GatewayResponse"
      Properties:
        ResponseParameters:
          "gatewayresponse.header.Access-Control-Allow-Origin": "'*'"
          "gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
        ResponseType: UNAUTHORIZED
        RestApiId: !Ref MyApi
        StatusCode: "401"
Run Code Online (Sandbox Code Playgroud)