访问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个回答

4
如果您启用AWS_IAM身份验证,则必须使用AWS凭证签署请求,使用AWS Signature Version 4

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


4
在我的情况下,这是一件相当愚蠢的事情。 我已经习惯于使用 POST 创建新实体,但出现了“缺少身份验证令牌”的故障。由于某种原因,我错过了它是以 PUT 定义的,而这是正常工作的。

1
这应该是被接受的答案。 - Spankied

4

今天我遇到了同样的问题,因为我错误地使用了GET而不是POST。我通过在Postman中将方法更改为POST来解决了这个问题。


3
您必须使用“调用URL”来从浏览器或POSTMAN触发Lambda函数...而是使用列在以下位置的“API端点”:
选择您的Lambda函数>>配置>>触发器。
在那里,您可以看到API端点。

attached image


2

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


2
如果您正在使用类型为PRIVATE的端点的API,请确保:
  1. 您从您的AWS帐户内调用API(例如:从在您的帐户中创建的EC2实例)

  2. 将必要的凭据(访问密钥和秘密密钥)放入EC2实例中的route ~/.aws/credentials(此路由适用于Linux实例)。如果IAM用户使用MFA,则还需要aws_session_token值。

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

  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

2

我曾经遇到过同样的问题,我是通过以下方式解决的:

GET方法测试

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello

Authorization tab ->select type(AWS signature)
•   Add AccessKey and SecretKey

1

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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

1

如果您为服务器设置了具有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)

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