Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 401 API网关自定义授权人返回的数据丢失';访问控制允许原点';标题_Amazon Web Services_Cors_Aws Lambda_Aws Api Gateway - Fatal编程技术网

Amazon web services 401 API网关自定义授权人返回的数据丢失';访问控制允许原点';标题

Amazon web services 401 API网关自定义授权人返回的数据丢失';访问控制允许原点';标题,amazon-web-services,cors,aws-lambda,aws-api-gateway,Amazon Web Services,Cors,Aws Lambda,Aws Api Gateway,为了防止未登录的用户通过AWS API网关调用我的lambda函数,我使用自定义授权器lambda解决方案 如果请求被授权(200),并且我从被调用的lambda得到响应,一切正常,我得到accesscontrolalloworigin头 但是,如果请求未经授权,我会得到一个401,它没有访问控制允许来源头,因此阻止我读取响应的401状态并将用户重定向到登录页面 我相信这是因为自定义自动化机制不知道请求需要使用CORS。有人知道这就是问题所在吗?您知道任何可能的解决方案吗?是的,这是API网关自

为了防止未登录的用户通过AWS API网关调用我的lambda函数,我使用自定义授权器lambda解决方案

如果请求被授权(200),并且我从被调用的lambda得到响应,一切正常,我得到
accesscontrolalloworigin

但是,如果请求未经授权,我会得到一个401,它没有
访问控制允许来源
头,因此阻止我读取响应的401状态并将用户重定向到登录页面


我相信这是因为自定义自动化机制不知道请求需要使用CORS。有人知道这就是问题所在吗?您知道任何可能的解决方案吗?

是的,这是API网关自定义授权程序的已知错误。谢谢你让我们注意到这一点。当我们部署修复程序后,团队将更新此帖子。对给您带来的不便表示歉意

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


请阅读我们的中的更多内容,其中包括一个CORS示例。

因为我花了一段时间才弄清楚如何将所有内容整合到云结构中,下面是一个演示如何设置它的片段

...
    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"

解决所有4XX错误(包括401个错误)的最简单方法是转到“网关响应”,然后选择“默认4XX”,然后在标题“访问控制允许原点”中添加值“*”


请参见屏幕截图:

添加到上述答案中,如果您没有使用Cloudformation/SAM模板,则可以使用此python脚本保存一些手动步骤:

import boto3
import sys

if len(sys.argv) != 3:
    print("usage: python script.py <API_ID> <STAGE>")
    exit()

client = boto3.client('apigateway')

response = client.put_gateway_response(
    restApiId=sys.argv[1],
    responseType='UNAUTHORIZED',
    statusCode='401',
    responseParameters={
        "gatewayresponse.header.Access-Control-Allow-Origin": "'*'",
        "gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
    }
)
response = client.create_deployment(
    restApiId=sys.argv[1],
    stageName=sys.argv[2])
导入boto3
导入系统
如果len(sys.argv)!=三:
打印(“用法:python script.py”)
退出()
client=boto3.client('apigateway')
响应=client.put\u gateway\u响应(
restApiId=sys.argv[1],
responseType='UNAUTHORIZED',
statusCode='401',
响应参数={
“gatewayresponse.header.Access Control允许来源”:“*”,
“gatewayresponse.header.Access Control允许标头”:“*”
}
)
response=client.create\u部署(
restApiId=sys.argv[1],
stageName=sys.argv[2])
这对我来说很有用(在AWS::APIGateway:定义中内联)

可用的网关响应包括:

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

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

如果您像我一样,在API Gateway V2(特别是HTTP API)中遇到问题,
ANY
方法似乎不适用于即插即用CORS产品。我必须为每个方法单独创建一个路由(很烦人,因为它们都调用相同的lambda函数,但很好)。

有更新吗?标题似乎仍然没有被发送。点击相同的问题。更新将是令人敬畏的是的,这仍然是一个问题,这是相当可笑的,考虑到它有多久了。这样的事情会使API网关无法投入生产,最糟糕的是,在投入大量资金投入服务之前,您无法发现。AWS团队,我们能做些什么来帮助您?我们严重依赖自定义授权程序lambdas,这个问题在我们的用户中造成了很多不愉快和混乱。我也有这个问题。现在已经调试了一段时间。这里是您需要的:被截取的json需要去哪里?如果您使用的是serverless.yaml,这就是您需要知道如何从lambda function本身返回cors头,就像使用callbcack或context.faile一样。我们无法使用通配符(“*”),因为我们需要发送cooke。你知道一种不使用通配符就允许多个访问控制allow Origin的方法吗?你给我指出了正确的方法,但经过一些更改,我把它放在MyAPI.GateawyResponses and works:Resources:MyAPI:Type:AWS::Serverless::Api属性:StageName:Dev GatewayResponses:UNAUTHORIZED:StatusCode:401 ResponseParameters:Headers:Access Control Allow Origin:“*”
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