访问 API 网关时缺少身份验证令牌? ?

我试图通过 AWS API 网关调用 Lambda 函数。 当我提到身份验证类型 NONE 时,它工作得很好,但是 API 变成公共的,任何拥有 URL 的人都可以访问我的 API。 为了保证 API 调用的安全性,我使用了验证类型 AWS _ IAM 和 也附加 AmazonAPIGatewayInvokeFullAccess 策略给我的用户,但得到这个错误:

{ message: "Missing Authentication Token"}

我不知道我错过了什么。

245566 次浏览

如果启用了 AWS _ IAM 身份验证,则必须使用 AWS 签名版本4使用 AWS 凭据对请求进行签名。

注意 : 登录到 AWS 控制台不会自动将浏览器的请求签署到 API。

在文件里找到了这个:

如果使用了 AWS _ IAM 授权,您将使用签名版本4协议对请求进行签名。

使用签名版本4签名请求


您还可以为您的 API 生成一个 SDK。

如何在 API 网关中为 API 生成 SDK

一旦您为您选择的平台生成了 SDK,步骤6提到,如果您使用 AWS 凭据,对 API 的请求将被签名:

  1. 若要使用 AWS 凭据初始化 API 网关生成的 SDK,请使用与下面类似的代码。如果使用 AWS 凭据,则对 API 的所有请求都将被签名。这意味着您必须为每个请求设置适当的 CORS Accept 头:

    var apigClient = apigClientFactory.newClient({
    accessKey: 'ACCESS_KEY',
    secretKey: 'SECRET_KEY',
    });
    

我认为您正在直接尝试访问 API 链接,这不会工作,因为 API 是安全的使用 IAM 角色,您必须提供 AWS 身份验证,即访问密钥和秘密密钥。

使用 Postman Chrome 扩展来测试你的 API: Http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html

我只是有同样的问题,它似乎也显示这个消息,如果资源无法找到。

在我的例子中,我更新了 API,但是忘记了重新部署。在将更新后的 API 部署到我的阶段之后,问题得到了解决。

我因为一个愚蠢的原因失去了一些时间:

当您创建一个阶段时,显示的链接不包含 URL 的资源部分:

Https://1111.execute-api.us-east-1.amazonaws.com/dev

API + 资源 URL Https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

/获取列表不见了

当然,您需要检查方法配置是否如下所示:

enter image description here

首先,检查在 lada 函数中创建的 API 是否已经注册到 AWS 项目中。为此,转到 AWS 控制台中的 API 网关。如果它没有注册,注册它。这是这个问题的主要原因。

您甚至可以在 Aws.export.js文件中看到与您的 API ['/items']对应的路径。

您的 API 必须出现在那里,否则它不会将安全令牌附加到请求。只要将它注册到您的项目云逻辑中,就可以在您的控制台中执行此操作了。

如果有,那么使用上面提到的解决方案
Http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html

看起来(截至2019年4月) AWS API Gateway 由于各种原因抛出了这个异常-主要是当您遇到 API Gateway 无法到达的端点时,或者是因为它没有部署,或者是在特定的 HTTP 方法不支持的情况下。

我希望网关发送更多适当的错误代码,比如不支持 HTTP 405方法或者找不到 HTTP 404,而不是一般的 HTTP 403 Forban。

请确保您创建资源,然后在其中创建方法。这是我的问题。谢谢

enter image description here

有时当您调用错误的 api 时会显示此消息

检查你的 API 端点

这个错误大多发生在调用错误的 api 端点时。 检查您正在调用的 api 端点,并在 api 网关上验证这一点。

对于记录,如果你不使用凭据,这个错误也会显示当你在 POST/PUT 方法中设置 请求验证程序为“验证主体,查询字符串参数和 HEADERS”,或者另一个选项“验证查询字符串参数和 HEADERS”... 在这种情况下,它会在头部查找凭据并拒绝请求。总而言之,如果您不打算发送凭据,并希望保持其打开,则不应在请求验证器中设置该选项(将其设置为 NONE 或验证主体)

请确保您首先在 Stages 树中单击特定的 Resource,因为这将用资源的 全路径填充 URL (而不仅仅是根路径) : enter image description here

有关其他原因,请参阅 http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/

如果您正在使用具有 二等兵类型端点的 API,请确保:

  1. 您正在从您的 AWS 帐户内调用 API (例如: 从您的帐户中创建的 EC2实例)

  2. 在路由 ~/中的 EC2实例中放置必要的凭据(访问和密钥)。Aws/凭证(此路由用于 linux 实例)如果 IAM 用户使用 MFA Aws _ session _ token值也是必需的。

  3. 使用基于 URL 的 vpce (vpc 端点)

  4. 您的 EC2实例有一个安全组,而不允许向 vpce 拥有的另一个安全组的出站流量,如:EC2 instance sg

  5. 您的 vpce 安全组允许来自 EC2实例拥有的另一个安全组(前一个来自 ec2实例的 sg)的入站流量,如:vpce sg

见: 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html

我尝试了以上所有的方法,如果你做了以上所有的步骤,但是你没有解决问题,那么:

  1. 在左边的菜单上,点击“资源”
  2. 在“ Resources”的右边,点击您想要测试的 api 方法,比如“ POST/GET etc”)
  3. 点击“ ACTION”列表(它位于步骤2中的 API 方法之上
  4. 选择“ DEPLOYAPI”(请这样做,即使您已经部署了您的 API)
  5. 在“部署阶段”中,选择“ prod”或任何您在前一个部署中编写的内容(它将覆盖您以前的部署)
  6. 按部署

我认为,因为,当我创建“方法请求”(参见步骤2如何到这个菜单) ,在“授权”我选择“ AWS _ IAM” 在测试 api 之后,在 aws 测试选项中,我在“ postman”中尝试它 然后我明白在“方法请求”,在“授权”,我应该选择“无”

我将其更改为无,但我认为 AWS 需要重新部署它,正如我所解释的

贡献:

我有一个类似的错误,因为我的返回响应不包含这样的“主体”:

返回{ “ statusCode”: 200, ‘ body’: “必须包含 body 标签,如果替换它不起作用” }

我遇到了同样的问题,我用下面的方法解决了它:

GET 方法测试

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab ->
•   select type(AWS signature)
•   Add AccessKey and SecretKey

如果为具有 AmazonAPIGatewayInvokeFullAccess 权限的服务器设置了 IAM 角色,那么仍然需要在每个请求上传递头文件。您可以在 python 中使用 Aws-request-auth库这样做:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
aws_region="us-east-1",
aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)

对我来说,这是一件相当愚蠢的事情。 我已经习惯了使用 POST 创建新的实体,而使用“丢失身份验证令牌”则会失败。我已经错过了,因为某些原因,它被定义为 PUT,这是工作良好。

对于任何仍然有问题的人来说,在意识到这一点之后,我真的感到非常愚蠢,但是我在添加 API 时传入了 /items的默认 URL。但是我一直用 /api调用端点。特别感谢 Carlos Alberto Schneider,因为我在读了你的文章后意识到了我的问题。

根据我的经验,请检查以下步骤:

  1. 在 API 网关端,确保添加了正确的路径,并在需要的阶段发布资源。对于像 path 参数(/user/{ user _ id })这样的 URL 模式,需要更多的注意才能进行检查。

  2. 确保为这个资源配置了正确的 选择方法,因为有时候是 CORS 导致了这个问题。

  3. 在 Lambda 端,确保指定了正确的处理程序名称作为入口点。

  4. 请总是检查您的 lambda 的云观察日志,可以帮助您确定您的 lambda 方面的问题。

在我的例子中,我错过了在 api 的末尾添加 “/”斜杠
真是个愚蠢的错误。

Https://le9dq5l9.execute-api.eu-west-1.amazonaws.com/v1/putdoctorinfo/

在我的案例中,我试图执行一个 更新类型请求,但是在我的 AWS SAM 模板中,我有一个 补丁类型请求:

Resources:
LambdaFunction:
Type: AWS::Serverless::Function # More info about Function Resource:
# https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: src/
Handler: app.lambda_handler
Runtime: python3.8
MemorySize: 128
Events:
UpdateItem:
Type: Api
Properties:
Path: /my-endpoint
Method: patch

我遇到了同样的问题,通过删除/dev/并只是放置: https://1111.execute-api.us-east-1.amazonaws.com/get-list来修复它

需要检查的事项:

1. In resources, check for Authorization and API Key if these are required.
2. Redeploy the API, new changes might not reflected.
3. Get the url from stages, directly by clicking on the actions like GET, POST, These will contain the full path urls.

您必须使用 < strong > 调用 Url 从您的浏览器或 POSTMAN 触发 Lambda 函数... 相反,使用 API 终点 ,它将列在:

选择 你的羊羔功能 > > Configuration > > Triggers。

在那里你可以看到 API 端点。

attached image

我也有同样的问题,即使我的访问是区域性的而不是私有的,没有对我的方法的授权,也没有 API。结果是,我把 root 端点称为“ https://azerty.execute-api.eu-west-3.amazonaws.com/dev/"”,它在 local 中返回一个 json,但是出现了一个错误。确保调用适当的端点,例如“ https://azerty.execute-api.eu-west-3.amazonaws.com/dev/hello" ;