【问题标题】:"No Access control header is present" - while calling AWS lambda function through API“不存在访问控制标头”-通过 API 调用 AWS lambda 函数时
【发布时间】:2020-07-11 15:59:33
【问题描述】:

我在 python 中创建了一个 Lambda 函数,在这个函数中我放置了带有跨源详细信息的标题。这是我的 Lambda 函数的代码:

def lambda_handler(event, context):    
    data=''
    s3_boto = boto3.client('s3')
    s3 = boto3.resource('s3')
    reference_elements = event['data1']
    test_elements = event['data2']
    try:
        #access first event object
        imagePath = []        
        data= compute_data(reference_elements, test_elements)
        return response({'message': data}, 200)      

    except Exception as e:
        return e
    return response({'message': data}, 200)

def response(message, status_code):
     return {
        'statusCode': str(status_code),
        'body': json.dumps(message),
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
            },
        }

现在我已经使用 POST 方法创建了一个 AWS API 网关并启用了 CORS。然后我部署了这个 API。 当我从 Postman 运行这个 API 时,它工作正常。 但是一旦我尝试从我的 React JS 代码中获取这个 API,它就会抛出以下错误: enter image description here

这是我在按钮点击中的 React Js 代码:

let postData = {"key1":"value1","key2":"value2","key3":"value3"}
const requestOptions = {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Access-Control-Allow-Headers": "*"
      },
      body: JSON.stringify(postData)
    }
    const url =
      "https://apiId.execute-api.us-east-1.amazonaws.com/apiFunctionName"
    fetch(url, requestOptions)
      .then(response => console.log(response))
      .then(data => console.log(data))

请纠正我哪里出错了,我已经投入了大量时间进行反复试验,但没有运气。

【问题讨论】:

  • 你能看看你的OPTIONS preflight 调用是否获得了 200 和正确的 CORS 标头?
  • `"Access-Control-Allow-Headers": "*" 是一个 response 标头,它在请求中没有位置。
  • 我也尝试过 'Access-Control-Allow-Origin': '*',在请求中,仍然没有成功
  • @Quentin 想说的是所有Access-Control-Allow 标头都是响应标头。不要在请求中发送它们
  • 是的,我已经删除了那部分。现在我的 javascript 请求代码如下所示:const requestOptions = { method: "POST", headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, body: JSON.stringify(postData) } const url = "https://awsId.us-east-1.amazonaws.com/calculateHomography" fetch(url, requestOptions) .then(response => console.log(response.json())) .then(data => console.log(data)) 但我仍然遇到同样的问题

标签: javascript reactjs aws-lambda aws-api-gateway es6-promise


【解决方案1】:

浏览器在调用跨域之前,使用OPTIONS 方法发出preflight 请求。在您的网络选项卡中,您应该会看到一个OPTIONS 呼叫,在您的情况下,ApiGateway 是不允许的。类似于您在网关上允许的POST 方法,允许OPTIONS 调用。根据您要允许的域,返回带有 200CORS 标头的 OPTIONS 调用。

【讨论】:

  • 你能给我截图我如何使用 OPTIONS 方法发出预检请求
  • 您不需要发出preflight 请求。浏览器发出该调用以确保您被允许提出您计划提出的任何请求。因此,当您尝试发帖时,会发出预检请求,如果预检的响应在Access-Control-Allow-Methods 响应标头中有POST 并且来源正确,则会发出实际请求。如果此调用返回非 200 或标头不匹配,您还应该在控制台上看到 CORS 异常。 developer.mozilla.org/en-US/docs/Glossary/Preflight_request
  • 我在控制台中收到 cors 错误,但在网络部分找不到任何 OPTIONS 消息。在控制台中,我只收到这些错误:“CORS 策略已阻止从源 'awsId.us-east-1.amazonaws.com/calculateData' 获取 'awsId.us-east-1.amazonaws.com/calculateData' 的访问权限:请求的资源上不存在 'Access-Control-Allow-Origin' 标头. 如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。POST awsId.us-east-1.amazonaws.com/calculateData net::ERR_FAILED
  • 在网络 XHR 部分中,当 Api 调用时,我得到了这个响应标头:content-length: 235 content-type: application/json date: Wed, 01 Apr 2020 05:16:55 GMT status: 200 x-amz-apigw-id: KSqG8FrhoAMFnNg= x-amzn-requestid: 2d2dddbe-e9c7-4584-bef5-7dd0b2d694c8 x-amzn-trace-id: Root=1-5e8423c5-148589d6a476b17cf9d53385;Sampled=0
  • 我已经为 chrome 安装了 Moesif Cors 转换器插件并将其打开,现在我的 API 调用在 localhost 上运行良好,但我需要在 sagemaker 中部署后检查它。
猜你喜欢
  • 2022-11-12
  • 2015-12-19
  • 2017-04-24
  • 2017-06-20
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2017-02-26
相关资源
最近更新 更多