【问题标题】:Missing Authentication Token while accessing API Gateway?访问 API 网关时缺少身份验证令牌?
【发布时间】:2017-01-31 23:25:53
【问题描述】:

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

{ message: "Missing Authentication Token"}

我不知道我在这里缺少什么。

【问题讨论】:

  • 我相信这里的大多数答案(如果不是全部)也适用于映射在给定 API 网关资源端点后面的任何其他 AWS 服务(即:还有 DynamoDB)。假设这是真的,API Gateway 是这里的操作接口(不是 AWS 服务资源)。
  • 错误是由于命中了错误的端点
  • 或使用错误方法的正确端点,GET 与 POST 等。

标签: amazon-web-services aws-api-gateway


【解决方案1】:

我因为一个愚蠢的原因浪费了一些时间:

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

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

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

/get-list 丢失

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

【讨论】:

  • 承认问题的愚蠢(但常见)原因需要特殊的荣誉。这也吸引了我。
  • 对不起,我没明白你的意思,如果你想检查一个发布请求是否设置为使用身份验证,你需要点击你创建的资源下的 POST 选项,对于例如,您的资源中可能有 /my-post-call,在它之下,您有 OPTION 和 POST 方法。单击 POST ,然后在方法配置中,您可以查看是否需要身份验证。但是,如果您想获取 post 调用的完整 URL,它的工作方式与获取 API URL + RESOURCE 相同,例如,1111.execute-api.us-east-1.amazonaws.com/dev/my-pos-tcall
  • 一个相关的、愚蠢的事情让我大吃一惊:确保你的 HTTP 动词是正确的。我错误地发送了 GET 而不是 POST。在路径和动词方面完全匹配的任何路线上,您似乎都会收到此错误。
  • FWIW,首先在阶段树中单击资源本身(在本例中为 GET),我认为应该直接显示该资源的完整 URL。更多细节和说明图片在我的相关答案中:stackoverflow.com/a/60858537/1357094
【解决方案2】:

我认为您是直接尝试访问 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 中是否有类似的方式?
  • 使用邮递员?问题是称它为“真实的”,而不是来自 Postman。 > 您必须提供 AWS 身份验证,即访问密钥和密钥如何?
【解决方案3】:

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

在我的情况下,我更新了 API,但忘记重新部署。将更新后的 API 部署到我的舞台后,该问题得到解决。

【讨论】:

  • 这就是我让它工作的方式。重新部署资源!。
【解决方案4】:

确保您首先单击阶段树中的特定资源,因为这将使用资源的完整路径(而不仅仅是根路径)填充 URL:

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

【讨论】:

  • @sumanthshetty 您是否尝试过此解决方案或此处的其他答案?还是您从这里阅读了 AWS 链接?
  • 我已经尝试了这里的所有答案以及文章
  • 那是我的错,我使用了错误的 URL
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    在文档中找到这个:

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

    Signing request with Signature Version 4


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

    How to generate an SDK for an API in API Gateway

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

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

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

    【讨论】:

      【解决方案7】:

      我尝试了以上所有方法,如果您完成了以上答案中的所有步骤,但您没有解决问题,那么:

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

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

      我将其更改为无,但我使用 AWS,需要再次部署它,正如我解释的那样

      【讨论】:

      • 我遇到了同样的问题,这解决了,谢谢。我的问题实际上与提到的有点不同,我的问题是我的身份验证类型为 NONE,但对 API 网关的请求不起作用。我通过(1)不在邮递员中提供任何授权,(2)部署api来解决它,因为我从不点击部署按钮。
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          就我而言,我错过了在 api 末尾添加 '/' 反斜杠
          真是个愚蠢的错误。

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

          【讨论】:

            【解决方案11】:

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

            检查您的 api 端点

            【讨论】:

              【解决方案12】:

              这个错误主要发生在你调用错误的 api 端点时。 检查您正在调用的 api 端点并在 api 网关上进行验证。

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                • 这应该是被接受的答案。
                【解决方案14】:

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

                【讨论】:

                  【解决方案15】:

                  如果您使用端点类型为 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 拥有的另一个安全组,例如:

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

                  见:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html

                  【讨论】:

                    【解决方案16】:

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

                    GET方法测试

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

                    【讨论】:

                      【解决方案17】:

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

                      【讨论】:

                        【解决方案18】:

                        贡献:

                        我遇到了类似的错误,因为我的返回响应不包含这样的“正文”:

                        返回 { “状态代码”:200, 'body': "必须包含 body 标签,如果你替换它不起作用" }

                        【讨论】:

                          【解决方案19】:

                          如果您为具有 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)
                          

                          【讨论】:

                            【解决方案20】:

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

                            【讨论】:

                              【解决方案21】:

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

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

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

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

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

                              【讨论】:

                                【解决方案22】:

                                在我的情况下,我试图执行 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
                                

                                【讨论】:

                                  猜你喜欢
                                  • 2019-03-25
                                  • 1970-01-01
                                  • 2018-05-02
                                  • 2019-05-21
                                  • 1970-01-01
                                  • 2020-09-18
                                  • 1970-01-01
                                  • 2021-08-28
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多