【问题标题】:Unable to resolve " not a valid key=value pair (missing equal-sign) in Authorization header" when POSTing to api gatewayPOST 到 api 网关时无法解析“授权标头中的键 = 值对(缺少等号)无效”
【发布时间】:2019-12-01 17:39:23
【问题描述】:

我创建了一个 api-gateway 来将数据放入我的 s3 存储桶中。当我在控制台中测试它时,它没有问题。即使我在授权人测试中测试我的令牌,它也会返回“允许”,所以我的令牌没有任何问题。我的令牌验证是

^Bearer [-0-9a-zA-z\.]*$

所以用于生成标题的 python 代码如下所示:

headers = {
    "Authorization": "Bearer " + token,
    "Content-type": "application/json"
}

我的其余代码是:

response = requests.post(url, headers=headers, data={"id":"0678a93d-ee8c-4db5-a831-1e311be4f04b", "test":"12345"})
print(response.text)

我得到的错误信息是 "{"message":"'{My Token}' 不是授权标头中的有效键=值对(缺少等号):'Bearer {My Token}'。"}"

我的网址如下所示:

https://my-api-gateway.amazonaws.com/MyStage,我在我的资源中使用了一个 {proxy+}。我注意到如果我将标题从 Content-type 更改为 Accept,它会给我同样的错误,但如果我也将我的 url 更改为 https://my-api-gateway.amazonaws.com/MyStage/any-arbitrary-string/,我会得到一个

   {"response":{"status":"VALID", "message": "success"}} 

但该文件未显示在我的 s3 存储桶中。我该如何解决这个问题?

【问题讨论】:

  • 您是否在 S3 存储桶上启用了 AWS_IAM?如果是这样,则需要使用 AWS Signature Version 4 签署您的请求。
  • 我不记得启用它。如何检查/验证这一点?
  • 我相信,如果您使用除主用户以外的任何用户,您将启用它,因为它是用户属性。这里有更多info on IAM,这里是call the API while using IAM的方法。

标签: python amazon-web-services aws-api-gateway


【解决方案1】:

当解析的 URL 不正确时,我遇到了这个错误。 (或者没有代理但 URL 不正确。)

【讨论】:

  • 另外,检查方法。它可能是 POST 而不是 GET 等。
  • Web 开发已经存在了很长时间。为什么他们不能做出清晰、准确的错误信息?无论如何,谢谢,这是我的问题的解决方案。
  • 非常感谢您:AWS 错误消息是毫无希望的调试这个。学过的知识;不要盲目相信文档。
【解决方案2】:

对我来说,它不起作用的原因是因为我在对集成进行更改时没有重新部署。

所以如果你使用 terraform 创建资源,你需要包含triggers 部分。见:https://www.terraform.io/docs/providers/aws/r/api_gateway_deployment.html#redeployment-triggers

如果您使用的是 UI,请检查:

【讨论】:

  • 在这里救了我的命
【解决方案3】:

我解决了。我将方法更改为来自根资源(而不是不必要的 {proxy+},并且还注意到我的 python 方法不正确。我有response = requests.post(url, headers=headers, data=my_json),但数据只接受一个字符串。我必须使用requests.post(url, headers=headers, json=my_json)requests.post(url, headers=headers,data=json.dumps(my_json))

【讨论】:

  • 为 POST 端点删除不必要的 /{Proxy+} 节省了我的时间。注意:{proxy+} 适用于 GET 端点。
【解决方案4】:

在路径中使用“{proxy+}”时,还需要添加根路径。添加“{proxy+}”是 api 网关知道您正在使用 Lambda 代理集成的方式。所以不要遗漏它。

即,

Type: AWS::Serverless::Function
    Properties:
       Events:
         ProxyResource:
           Type: Api
           Properties:
             RestApiId: ...
             Path: /{proxy+}
             Method: ANY
         RootResource:
           Type: Api
           Properties:
             RestApiId: ...
             Path: /
             Method: ANY

【讨论】:

    【解决方案5】:

    我也遇到过同样的问题。对我来说,问题是由于 URL 区分大小写。请确保每个单词的拼写和大小写正确。

    【讨论】:

      【解决方案6】:

      在我的情况下非常相似, 使用第三个 api 付款在 request TYPE 上设置错误,而不是删除我使用 post。啊,我的错。

      【讨论】:

        【解决方案7】:

        我在运行 AWS.config.update 时遇到了同样的错误。我有一个额外的空格字符,它给出了这个错误。只是在这里发布,因为它不清楚 - 但我相信很容易发现。

        【讨论】:

          猜你喜欢
          • 2020-11-16
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 2019-06-17
          • 1970-01-01
          • 2014-12-16
          • 2015-04-05
          • 2012-10-27
          相关资源
          最近更新 更多