如何在我的 API 网关代理集成中将授权方应用到 select 路由

How can I apply an Authorizer to select routes in my API Gateway Proxy integration

我正在使用无服务器框架将应用程序部署到 AWS Lambda。我的应用程序由单个 Lambda 提供服务,这就是我使用 {proxy+}:

通过请求路径的原因
functions:
  app:
    runtime: go1.x
    handler: bin/lambda
    events:
      - http:
         path: /{proxy+}
         method: any

现在,我想使用自定义授权方 Lambda 来保护我的应用程序的特定部分(想想一切 /admin/)。我想我可以像这样添加另一个使用授权方的事件定义:

functions:
  app:
    runtime: go1.x
    handler: bin/lambda
    events:
      - http:
          path: /admin/{proxy+}
          method: any
          authorizer:
            name: authorizer
            resultTtlInSeconds: 0
            identitySource: method.request.header.Authorization
      - http:
         path: /{proxy+}
         method: any

然而这根本没有效果。如果我将我的授权器应用于根级代理,它将按预期应用,因此授权器本身按预期工作。

在这种情况下如何定义我的路线?我需要使用不同的 Lambda 还是缺少某些东西?

你应该看看 https://docs.aws.amazon.com/en_pv/apigateway/latest/developerguide/api-gateway-swagger-extensions.html

基本上(对于 open api 3.0)你会在你的路线上定义一个 security 键。此类键的定义在 components.securitySchemas

我能想到的有两个方案:

  1. 如果您真的想要按照您编写的方式使用端点,您可以使用通用端点(根端点)并在该处理程序内部检查请求是否针对 /admin 然后重定向或为此做一些其他特殊情况。

  2. 放弃拥有根端点并使用两个 "normal" 端点:

    functions:
      app:
        runtime: go1.x
        handler: bin/lambda
        events:
          - http:
              path: /admin/{proxy+}
              method: any
              authorizer:
                name: authorizer
                resultTtlInSeconds: 0
                identitySource: method.request.header.Authorization
          - http:
             path: /user/{proxy+}
             method: any