我正在尝试通过AWS API Gateway调用Lambda函数。当我提到身份验证类型NONE时,它可以正常工作,但API成为公共的,任何具有url的人都可以访问我的API。为了使API调用安全,我正在使用身份验证类型AWS_IAM,并且还向用户附加了AmazonAPIGatewayInvokeFullAccess策略,但出现此错误:
{ message: "Missing Authentication Token"}
我不知道我在这里想念的是什么。
我正在尝试通过AWS API Gateway调用Lambda函数。当我提到身份验证类型NONE时,它可以正常工作,但API成为公共的,任何具有url的人都可以访问我的API。为了使API调用安全,我正在使用身份验证类型AWS_IAM,并且还向用户附加了AmazonAPIGatewayInvokeFullAccess策略,但出现此错误:
{ message: "Missing Authentication Token"}
我不知道我在这里想念的是什么。
Answers:
我认为您正在直接尝试访问API链接,因为API使用IAM角色进行了安全保护,并且您必须提供AWS身份验证(即访问密钥和秘密密钥),因此无法使用。
使用Postman Chrome扩展程序来测试您的API:http : //docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html
我由于愚蠢的原因浪费了一些时间:
创建阶段时,显示的链接不包含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
在/获取列表不见了
当然,您需要检查方法配置是否如下所示:
确保首先在“阶段”树中单击特定的“资源”,因为这将使用资源的完整路径(而不只是根路径)填充URL :
对于其他原因,请参见http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/
在文档中找到了这一点:
如果使用了AWS_IAM授权,则可以使用Signature Version 4协议对请求进行签名。
您也可以为您的API生成一个SDK。
为所选平台生成SDK之后,第6步提到如果您使用的是AWS凭证,则将对该API的请求进行签名:
要使用AWS凭证初始化API Gateway生成的SDK,请使用类似于以下代码。如果您使用AWS凭证,则将对该API的所有请求进行签名。这意味着您必须为每个请求设置适当的CORS Accept标头:
var apigClient = apigClientFactory.newClient({
accessKey: 'ACCESS_KEY',
secretKey: 'SECRET_KEY',
});
如果启用AWS_IAM身份验证,则必须使用AWS Signature版本4使用AWS凭证对请求进行签名。
注意:登录到AWS控制台不会自动将浏览器的请求签名到API。
我尝试了上述所有方法,如果您按照上述答案进行了所有步骤,但仍未解决问题,则:
我的原因是,当我创建“ METHOD REQUEST”(请参阅第2步如何转到此菜单)时,在“授权”中测试api之后选择“ AWS_IAM”,在aws test选项中,我在“ postman”中尝试”,那么我会理解“方法请求”中的“授权”中的“我没有”
我将其更改为无,但我认为AWS需要再次部署它,如我所解释的
如果您使用的端点类型为PRIVATE的API ,请确保:
您正在从您的AWS账户中调用API(例如:从在您的账户中创建的EC2实例)
在路由〜/ .aws / credentials(此路由用于linux实例)的EC2实例中放置必要的凭据(访问和秘密密钥)(如果该路由用于linux实例),如果IAM用户使用MFA,也将需要aws_session_token值。
使用基于vpce(vpc端点)的URL。示例:curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status
请参阅:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html
首先,检查您在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
我遇到了相同的问题,可以通过以下方式解决:
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角色,则仍需要在每个请求上传递标头。您可以使用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)