Amazon web services 401 API网关自定义授权人返回的数据丢失';访问控制允许原点';标题
为了防止未登录的用户通过AWS API网关调用我的lambda函数,我使用自定义授权器lambda解决方案 如果请求被授权(200),并且我从被调用的lambda得到响应,一切正常,我得到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网关自
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