访问API Gateway时出现“缺少身份验证令牌”?

218

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

{ message: "Missing Authentication Token"}
我不知道我在这里缺少了什么。

我相信这里大多数,如果不是全部的答案也同样适用于任何其他AWS服务(例如:DynamoDB),只要它们映射在给定的API Gateway资源端点后面。假设这是真的,API Gateway是操作接口(而不是AWS服务资源)。 - cellepo
11
错误是因为访问了错误的终端节点所导致的。 - Rexben
5
或者是使用错误的方法,比如GET和POST混淆了右端点等。 - RaisinBranCrunch
1
我的问题不同,哈哈,我忘记将API部署到暂存区,因此对我无效。 xD - keidakida
我花了太长时间才意识到在 API 网关中进行更改后总是需要部署,这就是我遇到同样错误的原因。 - Pete
显示剩余2条评论
27个回答

391

65
需要特别表扬的是能够承认问题的愚蠢(但常见)原因。这也困扰了我。 - Jeff Richards
抱歉,我不明白你的意思。如果你想检查一个POST请求是否设置了身份验证,你需要点击所创建资源下的POST选项。例如,你可能在你的资源中有/my-post-call,在它下面有OPTION和POST方法。点击POST,然后在方法配置中,你可以看到是否需要身份验证。但是,如果你想获取一个POST调用的完整URL,它的工作方式与获取API URL + RESOURCE的方式相同。例如,https://1111.execute-api.us-east-1.amazonaws.com/dev/my-pos-tcall。 - Carlos Alberto Schneider
5
有个相关的问题让我犯了迷糊:确保你的HTTP动词是正确的。我因为错误地发送了GET而不是POST而遇到了这个问题。似乎只要路径和动词在匹配时不是完全相同的,你就会收到这个错误提示。请注意路径和动词的准确性。 - Josh1billion
谢谢你!我遇到的另一个问题是,我试图将我的API密钥添加到Postman中的“params”而不是“Headers”中。我知道它不会起作用,因为在“KEY”列中,我开始输入“x-api”,它自动填充了密钥名称,然后只需将API密钥添加到“VALUE”列中即可。再次感谢! - Z41N
我之前发送了一个PUT请求而不是POST请求,这就是为什么我一直收到相同错误的原因。 - Santosh
显示剩余3条评论

57

1
嗨,Saddam,SOAP UI中如何进行AWS身份验证?在POSTMAN中非常容易。我们是否有类似的方式在SOAP UI中实现? - Pankaj Sharma
1
使用Postman? 问题是要“真正”调用它,而不是从Postman中调用。 你必须提供AWS身份验证,即访问密钥和秘密密钥。 如何做到? - Alex 75

38

我刚遇到了同样的问题,看起来如果资源找不到,它也会显示这个消息。

在我的情况下,我已经更新了API,但忘记重新部署。在将更新后的API部署到我的阶段之后,问题得到了解决。


1
那就是我讓它運作的方式。重新部署了資源! - KQI

29

你能看一下这个吗?https://stackoverflow.com/questions/62894455/messagemissing-authentication-token-while-accessing-lambda-through-api-en - sumanth shetty
@sumanthshetty 你尝试过这个解决方案吗?或者你试了其他回答中的任何一个?还是你阅读了这里的 AWS 链接? - cellepo
我已经尝试了这里所有的答案和文章。 - sumanth shetty
那是我的错,我使用了错误的URL。 - Khan
我在一个POST方法上使用了GET,然后它显示授权错误而不是方法不存在。 - weiheng

14

看起来(截至2019年4月)AWS API Gateway出现这种异常的原因有多种——大多数情况下是因为您正在访问API Gateway无法到达的端点,这可能是因为它未部署,或者在不支持该特定HTTP方法的情况下也会发生。

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


最新的403响应头/消息/根本原因列表: https://repost.aws/knowledge-center/api-gateway-troubleshoot-403-forbidden - Marc Tamsky

12

反斜杠是 \。它指的是其切割方向,而不是“在 URL 后面”。/ 是正斜杠。 - Diego
点赞。我在这上面花费了很多尴尬的时间。通过terraform部署。从Postman中可以正常工作,但是从React中返回“MissingAuthenticationTokenException”。问题就在于,在使用axios的React中URL需要以“/”结尾... - jgnovak-dev

9

我尝试了以上所有方法,如果您完成以上所有步骤仍然无法解决问题,则:

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

我认为问题出在当我创建“METHOD REQUEST”时(请参见步骤2如何进入此菜单),我在“Authorization”中选择了“AWS_IAM”,之后在aws测试选项中尝试在“postman”中测试api,然后我理解了在“METHOD REQUEST”中,“Authorization”中,我应该选择“none”。

我更改了它以选择“none”,但是我认为AWS需要重新部署它,就像我所解释的那样。


我曾经遇到过同样的问题并通过以下方法解决,谢谢。我的问题实际上与提到的有点不同,我的问题是我的认证类型为“NONE”,但向API网关发出的请求不能工作。我通过以下方法解决了问题:(1) 在Postman中不提供任何授权,(2) 部署API,因为我从没有点击部署按钮。 - Iching Chang

8
确保您创建资源,然后在其中创建方法。这就是我的问题所在。谢谢。 enter image description here

8

在文档中找到以下内容:

如果使用AWS_IAM授权,则可以使用Signature Version 4协议签署请求。

使用Signature Version 4签署请求


您还可以为API生成SDK。

如何在API Gateway中为API生成SDK

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

  1. To initialize the API Gateway-generated SDK with AWS credentials, use code similar to the following. If you use AWS credentials, all requests to the API will be signed. This means you must set the appropriate CORS Accept headers for each request:

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

4
有时候当你调用错误的API时会显示这个消息。
请检查你的API端点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接