具有自定义授权者和 CORS 的 AWS API Gateway 间歇性 200 然后 403 然后 200 ...奇怪

2023-12-01

我有一个带有自定义授权者的 1 Amazon Api Gateway 设置(授权者基本上只返回允许任何内容)

我启用了 CORS,这是从jQuery网页。

我有两个方法

  1. /vehicles(返回汽车列表)
  2. /bookings(返回预订详细信息)

我看到的行为是第一个请求进展顺利,我看到它拉动了OPTIONS,然后执行GET要求。Then,我打了另一种方法OPTIONS有效,然后 get 返回一个403,但是如果我再次发起请求(在同一资源上),我得到一个200

我正在使用 Cloudformation,但在使用无服务器框架时我注意到同样的行为。

以下是我理智的一些屏幕截图,希望其他人也看到了这种奇怪的情况。

enter image description here

enter image description here

下面是我的 Cloudformation YAML 模板的一部分,我是边做边学的。

 HelloAPI:
    Type: AWS::Serverless::Api
    Properties:
      StageName: !Sub ${Environment}
      DefinitionBody:
        swagger: 2.0
        info:
          title:
            Ref: AWS::StackName
        securityDefinitions:
          test-authorizer:
            type: apiKey
            name: Authorization
            in: header
            x-amazon-apigateway-authtype: custom
            x-amazon-apigateway-authorizer:
              type: token
              authorizerUri:
                Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${AuthorizerFunc.Arn}/invocations
              authorizerResultTtlInSeconds: 5
        paths:
          /vehicles:
            get:
              x-amazon-apigateway-integration:
                httpMethod: POST
                type: aws_proxy
                uri:
                  !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${VehiclesLambda.Arn}/invocations
              responses: {}
              security:
                - test-authorizer: []
            options:
              tags:
              - "CORS"
              summary: "CORS support"
              description: "Enable CORS by returning correct headers\n"
              consumes:
              - "application/json"
              produces:
              - "application/json"
              parameters: []
              responses:
                "200":
                  description: "Default response for CORS method"
                  headers:
                    Access-Control-Allow-Headers:
                      type: "string"
                    Access-Control-Allow-Methods:
                      type: "string"
                    Access-Control-Allow-Origin:
                      type: "string"
              x-amazon-apigateway-integration:
                type: "mock"
                requestTemplates:
                  application/json: "{\n  \"statusCode\" : 200\n}\n"
                responses:
                  default:
                    statusCode: "200"
                    responseParameters:
                      method.response.header.Access-Control-Allow-Headers: "'X-Amz-Date,Authorization,X-Api-Key'"
                      method.response.header.Access-Control-Allow-Methods: "'*'"
                      method.response.header.Access-Control-Allow-Origin: "'*'"
                    responseTemplates:
                      application/json: "{}\n"
          /bookings:
            get:
              x-amazon-apigateway-integration:
                httpMethod: POST
                type: aws_proxy
                uri:
                  !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${BookingsLambda.Arn}/invocations
              responses: {}
              security:
                - test-authorizer: []
            options:
              tags:
              - "CORS"
              summary: "CORS support"
              description: "Enable CORS by returning correct headers\n"
              consumes:
              - "application/json"
              produces:
              - "application/json"
              parameters: []
              responses:
                "200":
                  description: "Default response for CORS method"
                  headers:
                    Access-Control-Allow-Headers:
                      type: "string"
                    Access-Control-Allow-Methods:
                      type: "string"
                    Access-Control-Allow-Origin:
                      type: "string"
              x-amazon-apigateway-integration:
                type: "mock"
                requestTemplates:
                  application/json: "{\n  \"statusCode\" : 200\n}\n"
                responses:
                  default:
                    statusCode: "200"
                    responseParameters:
                      method.response.header.Access-Control-Allow-Headers: "'X-Amz-Date,Authorization,X-Api-Key'"
                      method.response.header.Access-Control-Allow-Methods: "'*'"
                      method.response.header.Access-Control-Allow-Origin: "'*'"
                    responseTemplates:
                      application/json: "{}\n"

这是我的一切顺利授权者:

'use strict';

const generatePolicy = function(principalId, effect, resource) {
    const authResponse = {};
    authResponse.principalId = principalId;
    if (effect && resource) {
        const policyDocument = {};
        policyDocument.Version = '2012-10-17';
        policyDocument.Statement = [];
        const statementOne = {};
        statementOne.Action = 'execute-api:Invoke';
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    return authResponse;
};

exports.handler = (event, context, callback) => {

    console.log("Hit Authorizer")
    console.log(event)


    callback(null, generatePolicy('user123', 'Allow', event.methodArn));

}; 

其他人见过这个,或者知道如何调试它吗?

我把它放在一个测试站点上,只是有人想看看我所看到的。

https://s3.amazonaws.com/stackoverflowisgreat2/index.html


在自定义授权者代码中,在该行

statementOne.Resource = resource;

将您的资源更改为以下格式“arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/”。

在您的情况下,允许所有这些将是:

statementOne.Resource = arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/*/

这就是 AWS 了解您的授权人的方式。因为在自定义授权方中,您可以从请求标头中获取信息,例如用户、组等,然后根据您的授权数据库验证信息,并决定允许谁或什么继续请求类型 POST/GET/OPTION,但 API 网关不会在您以 AWS 格式提供有效答案之前,我们不会知道您的决定

{
  "principalId": "yyyyyyyy", // The principal user identification associated with the token sent by the client.
  "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/{httpVerb}/[{resource}/[child-resources]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"  # Optional
}

您可以访问此页面以了解更多相关信息:

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有自定义授权者和 CORS 的 AWS API Gateway 间歇性 200 然后 403 然后 200 ...奇怪 的相关文章

随机推荐

  • GCC LTO 是否执行跨文件死代码消除?

    说我有一个函数 void do something ifdef FEATURE X feature x endif 我可以毫无问题地编译和运行它 如果我想要这个功能我可以通过 D FEATURE X它有效 但是 如果我想把do someth
  • 长时间运行的线程如何在 Web 应用程序中工作

    所以我在 MVC 控制器方法内部有以下代码 public ActionResult ProcessFile ThreadStart threadStart new ThreadStart gt Doing some long process
  • 使用 dplyr mutate 根据列名向量创建新列

    我想获取一些列的日志 并创建全部命名为 log 原始列名称 的新列 下面的代码有效 但是我如何传递名为columnstolog变异 谢谢 library dplyr data mtcars columnstolog lt c mpg cyl
  • 适用于 Twitter API 的 Windows Phone SDK

    我想在 WindowsPhone7 上为 Twitter 开发一个示例应用程序 所以有人建议我是否有适用于 Windows Phone 的 SDK 可用 还有 OAuth API 实现的任何代码示例 谢谢 有一些关于构建 Twitter 应
  • 在 C 语言中 strcmp() 到底返回什么?

    我用 C 语言编写了这段代码 include
  • 使用 COALESCE 函数使值以逗号分隔

    我有一张桌子 EMP 我知道使用COALESCE函数我们可以通过这种方式获取任意列的值 23 23 45 34 SELECT OfferID FROM Emp where EmpID 23 但我没有得到实现此目的的语法 任何帮助都会很好地解
  • NPAPI 插件之上的 HTML

    在我使用 FireBreath 和 OpenGL 编写完浏览器插件并使用对象标签嵌入插件后 我尝试在插件之上覆盖各种 HTML 元素 不幸的是 无论我如何尝试 标签和插件图形始终位于页面上任何其他 HTML 元素的顶部 据我所知 flash
  • 使用 awk 在数字和数字之间转换月份

    在过去的考试试卷中 我有一个问题 月份可以用不同的方式表示 例如数字 1 2 12 或三字母月份名称 Jan Feb Dec 建议如何使用 awk 中的关联数组来转换 三个字母的月份名称到月份数字 反之亦然 到 将月份数字翻译为三个字母的月
  • nodejs - mongodb - 如何找到所有a!= b?

    这是征集会 id R65i3SmvucW9imK2cxA6wdFb GXoSHjly7obzFNslklNCBvE0UrW qOiNmiBtPN24 1c session channel all username xuka expires
  • STL 容器分配放置新

    我找不到这个问题的确切答案 因此在这里发帖 当我想到向量时 它需要在连续的内存位置构建对象 这意味着向量保持分配的内存 并且必须对推入其中的对象进行就地构造 放置新的 这是一个有效的假设吗 另外 这是否意味着容器正在手动调用析构函数而不是调
  • 如何使用 lxml 从此 HTML 片段获取文本?

    谁能解释为什么这个片段在断言上失败 from lxml import etree s div h2 img XYZZY h2 div root etree fromstring s elements root xpath contains
  • asp.net core 运行时标签中的 6 个奇怪属性

    我有一个 VS2022 asp net core 6 Web 应用程序 运行时许多 Layout cshtml 标记中的 html 标记属性 b g6ltozs93r 无效 这是一个未受影响的项目的示例 VS2019 net5 或更早版本不
  • 发送短信和彩信

    我正在考虑用我自己的应用程序替换默认的 Android 短信应用程序 但我不完全知道如何发送短信和彩信短信 我想至少得到它 以便我可以先发送短信 因为我认为发送彩信会困难得多 那么 发送这些类型的消息时具体应该怎么做呢 有没有足够容易理解的
  • 我应该在 1.x、2.2 和 0.23 中选择哪个 hadoop 版本

    您好 我是 Hadoop 新手 对版本名称非常困惑 我应该使用 1 x 强大的支持和学习资源 2 2 或 0 23 中的哪一个 我读到 hadoop 正在从 v0 23 完全迁移到 YARN link1 但与此同时 整个网络都在说 hado
  • 为什么HTML标签在elasticsearch中被过滤掉了还是可搜索的

    我是 elasticsearch 的新手 正在测试 html strip 过滤器 理想情况下 我不应该能够搜索 HTML 标签 以下是步骤 Index curl XPOST localhost 9200 foo test analyzer
  • MATLAB 中的绘图函数

    我在 Matlab 中绘制以下函数时遇到问题 x 10 sin pi f 0 1 pi f 0 1 2 我正在使用这段代码 f 50 0 1 50 x 10 sin pi f 0 1 pi f 0 1 2 plot f x 我可以使用在 g
  • 在所选文件中找不到从 DbContext 派生的可构造类型 (EF Power Tools Beta 2 + VS 2012))

    我将 VS 2012 Ultimate 与 Entity Framework Power Tools Beta 2 和实体框架 5 0 使用 nuget 一起使用 我创建了一个 DbContext 类 当我右键单击解决方案资源管理器中的相应
  • 将列转换为行的 SQL 查询

    我有一个如下所示的表格 我的问题是 如何将列转换为行 我正在使用 Microsoft SQL Server sip RECno user1 user2 user3 user4 1 ram ravi sam raj 我需要像下面这样的操作 u
  • 具有任意排序功能的 NSSortDescriptor

    我无法理解如何使用 NSSortDescriptor 进行任意排序 我想做这样的事情 NSArray sortAlgorithm NSArray arrayWithObjects r a nil NSSortDescriptor sortD
  • 具有自定义授权者和 CORS 的 AWS API Gateway 间歇性 200 然后 403 然后 200 ...奇怪

    我有一个带有自定义授权者的 1 Amazon Api Gateway 设置 授权者基本上只返回允许任何内容 我启用了 CORS 这是从jQuery网页 我有两个方法 vehicles 返回汽车列表 bookings 返回预订详细信息 我看到