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


82

我正在尝试通过AWS API Gateway调用Lambda函数。当我提到身份验证类型NONE时,它可以正常工作,但API成为公共的,任何具有url的人都可以访问我的API。为了使API调用安全,我正在使用身份验证类型AWS_IAM,并且还向用户附加了AmazonAPIGatewayInvokeFullAccess策略,但出现此错误:

{ message: "Missing Authentication Token"}

我不知道我在这里想念的是什么。


我相信,这里的大多数答案(即使不是全部)也适用于映射到给定API网关资源终端节点后面的任何其他AWS服务(即:DynamoDB)。假设是真的,API网关是此处的有效接口(不是AWS服务资源)。
cellepo

该错误是由于命中了错误的端点
所致

Answers:


40

我认为您正在直接尝试访问API链接,因为API使用IAM角色进行了安全保护,并且您必须提供AWS身份验证(即访问密钥和秘密密钥),因此无法使用。

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


萨达姆,您好:如何在SOAP ui中完成AWS身份验证。在POSTMAN中,这非常容易。我们在SOAP UI中有类似的方法吗?
Pankaj Sharma,

154

我由于愚蠢的原因浪费了一些时间:

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

API网址: https //1111.execute-api.us-east-1.amazonaws.com/dev

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

/获取列表不见了

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

在此处输入图片说明


11
承认问题的愚蠢(但常见)原因需要特殊的荣誉。这也让我高兴。
杰夫·理查兹

抱歉,我不明白您的意思,如果您想检查是否已设置使用身份验证的发布请求,则需要单击所创建资源下的POST选项,例如,您可能拥有/ my-在资源中进行后期调用,并且在其下具有OPTION和POST方法。单击POST,然后在方法配置中,您可以查看是否需要身份验证。但是,如果您想获得完整的URL来进行邮寄,则其工作方式与获取API URL +资源相同,例如 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
卡洛斯·阿尔贝托·施耐德,

2
一个让我震惊的相关愚蠢的事情:确保您的HTTP动词正确。我错误地发送GET而不是POST。看来在路径和动词都不完全匹配的任何路线上都会出现此错误。
Josh1billion

非常感谢 !!当您提到它时,它是如此简单。我没意识到 谢谢你,兄弟!
ylev

FWIW,我相信首先在“阶段”树中单击资源本身(在本例中为GET),我认为应该直接显示该资源的完整URL。我的相关答案中有更多详细信息和解释性图片: stackoverflow.com/a/60858537/1357094
cellepo

21

我只是遇到了同样的问题,而且如果找不到该资源,它似乎也会显示此消息。

就我而言,我已经更新了API,但忘了重新部署。将更新的API部署到我的平台后,该问题已解决。


这就是我让它起作用的方式。重新部署资源!
KQI

7

看起来(截至2019年4月),AWS API Gateway出于各种原因引发此异常-主要是在您遇到API Gateway无法访问的端点时(由于未部署它),或者在特定情况下不支持HTTP方法。

我希望网关发送更合适的错误代码,例如不支持HTTP 405方法或找不到HTTP 404,而不是通用的HTTP 403禁止访问。


7

确保首先在“阶段”树中单击特定的“资源”,因为这将使用资源的完整路径(而不只是根路径)填充URL : 在此处输入图片说明

对于其他原因,请参见http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/



@sumanthshetty,您尝试过此解决方案,还是这里的其余答案?还是您从这里阅读了AWS链接?
cellepo

我从这里尝试了所有答案,也尝试了这篇文章
sumanth shetty


5

在文档中找到了这一点:

如果使用了AWS_IAM授权,则可以使用Signature Version 4协议对请求进行签名。

使用签名版本4签名请求


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

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

为所选平台生成SDK之后,第6步提到如果您使用的是AWS凭证,则将对该API的请求进行签名:

  1. 要使用AWS凭证初始化API Gateway生成的SDK,请使用类似于以下代码。如果您使用AWS凭证,则将对该API的所有请求进行签名。这意味着您必须为每个请求设置适当的CORS Accept标头:

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



2

我尝试了上述所有方法,如果您按照上述答案进行了所有步骤,但仍未解决问题,则:

  1. 在左侧菜单上,点击“资源”
  2. 在“资源”的右侧,点击您要测试的api方法,例如“ POST / GET等”
  3. 点击“操作”列表(位于步骤2中的API方法上方
  4. 选择“ DEPLOY API”(请执行此操作,即使您已经部署了api)
  5. 在“部署阶段”中,选择“产品”或您在先前部署中编写的内容(它将覆盖您先前的部署
  6. 命中部署

我的原因是,当我创建“ METHOD REQUEST”(请参阅​​第2步如何转到此菜单)时,在“授权”中测试api之后选择“ AWS_IAM”,在aws test选项中,我在“ postman”中尝试”,那么我会理解“方法请求”中的“授权”中的“我没有”

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


1

当您调用错误的api端点时,通常会出现此错误。检查您正在调用的api端点,并在api网关上进行验证。


1

如果您使用的端点类型为PRIVATE的API ,请确保:

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

  2. 在路由〜/ .aws / credentials(此路由用于linux实例)的EC2实例中放置必要的凭据(访问和秘密密钥)(如果该路由用于linux实例),如果IAM用户使用MFA,也将需要aws_session_token值。

  3. 使用基于vpce(vpc端点)的URL。示例:curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

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

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

请参阅:https//docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


0

首先,检查您在lamda函数中创建的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


0

作为记录,如果您不使用凭据,则当您在POST / PUT方法中将请求验证器设置为“验证正文,查询字符串参数和HEADERS”或另一个选项“验证查询字符串”时,也会显示此错误。参数和标题”。在这种情况下,它将在标题上查找凭证并拒绝该请求。综上所述,如果您不打算发送凭据并希望使其保持打开状态,则不应在请求验证器中设置该选项(将其设置为NONE或验证正文)


0

贡献:

我有一个类似的错误,因为我的返回响应不包含如下“ body”:

return {'statusCode':200,'body':“必须包含body标记,如果您将其替换将不起作用”}


0

我遇到了相同的问题,可以通过以下方式解决:

GET方法测试

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

0

如果您为具有AmazonAPIGatewayInvokeFullAccess权限的服务器设置IAM角色,则仍需要在每个请求上传递标头。您可以使用aws-requests-auth库在python中执行以下操作:

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)

0

就我而言,这是很愚蠢的事情。我已经习惯了使用POST创建新实体,并且由于“缺少身份验证令牌”而失败。由于某种原因,我已经错过了它被定义为运行良好的PUT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.