繁体   English   中英

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

[英]Missing Authentication Token while accessing API Gateway?

我正在尝试通过 AWS API 网关呼叫 Lambda Function。 当我提到身份验证类型 NONE 时,它工作正常,但 API 公开并且任何拥有 url 的人都可以访问我的 API。为了使 API 调用安全,我使用身份验证类型 AWS_IAM 并且还向我的用户附加了 AmazonAPIGatewayInvokeFullAccess 策略但收到此错误:

{ message: "Missing Authentication Token"}

我不知道我在这里错过了什么。

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

创建阶段时,显示的链接不包含 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

/get-list丢失

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

在此处输入图片说明

我认为您是直接尝试访问 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: 在此处输入图片说明

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

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

我希望网关发送更合适的错误代码,例如 HTTP 405 Method not supported 或 HTTP 404 not found,而不是通用的 HTTP 403 Forbidden。

在文档中找到了这个:

如果使用 AWS_IAM 授权,您将使用签名版本 4 协议签署请求。

签名版本 4 的签名请求


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

如何为 API Gateway 中的 API 生成 SDK

为您选择的平台生成开发工具包后,第 6 步提到如果您使用 AWS 凭证,将对 API 的请求进行签名:

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

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

确保您创建了 Resource,然后在其中创建了方法。 这就是我的问题。 谢谢

在此处输入图片说明

我尝试了以上所有方法,如果您执行了上述答案中的所有步骤,但没有解决问题,则:

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

我的原因是,当我创建“方法请求”(请参阅​​第 2 步如何转到此菜单)时,在“授权”中,我在测试 api 后选择“AWS_IAM”,在 aws 测试选项中,我在“邮递员”中尝试”然后我理解在“方法请求”中,在“授权”中,我应该选择“无”

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

如果您启用 AWS_IAM 身份验证,则必须使用AWS 签名版本 4使用AWS凭证签署您的请求。

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

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

检查您的 api 端点

就我而言,我错过了在 api 末尾添加“/”反斜杠
这么愚蠢的错误。

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

您必须使用Invoke Url从浏览器触发 Lambda Function 或 POSTMAN... 相反,请使用API 端点,它将列在:

select yourLambdaFunction >> 配置 >> 触发器。

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

附加图像

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

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

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

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

  2. 将必要的凭证(访问和秘密密钥)放在路由 ~/.aws/credentials 中的 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)的入站流量,例如: 副总裁

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

就我而言,这是一件非常愚蠢的事情。 我已经习惯了使用 POST 创建新实体,但它因“缺少身份验证令牌”而失败。 由于某种原因,我错过了它被定义为工作正常的 PUT。

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

  1. 在 API 网关端,确保添加正确的路径并在所需的阶段发布资源。 对于一些像路径参数(/user/{user_id})这样的 url 模式需要更多注意检查。

  2. 请确保为此资源配置正确的选项方法,因为有时是 CORS 导致此问题。

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

  4. 请始终检查您的 lambda 的 cloudwatch 日志,这可以帮助您确定 lambda 方面的问题。

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

首先,检查您在 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

贡献:

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

return { '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 角色,您仍然需要在每个请求上传递标头。 您可以使用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)

好吧,对于仍然有问题的任何人,在意识到这一点后我真的觉得很愚蠢,但是我在添加 API 时传入了/items的默认 URL。 但我一直用/api调用端点。 特别感谢Carlos Alberto Schneider ,因为我在阅读您的帖子后意识到了我的问题。

在我的例子中,我试图做一个UPDATE类型的请求,但在我的 AWS SAM 模板中,我有一个PATCH类型的请求:

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

要检查的事情:

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.

即使我的访问权限是区域性的而不是私有的,我也遇到了同样的问题,我的方法也没有授权 API。事实证明我正在调用根端点“https://azerty.execute-api.eu-west-3。 amazonaws.com/dev/”,它在本地返回给我一个 json 但引发了错误。 请务必调用正确的端点,例如“https://azerty.execute-api.eu-west-3.amazonaws.com/dev/hello”

我今天遇到了同样的问题,因为我使用的是 GET 而不是 POST。 通过将方法更改为 postman 中的 POST 解决了这些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM