OpenAPI规范中定义的带有Cognito授权者的AWS APIGateway

时间:2019-05-28 08:04:03

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

工具

  • Terraform v0.11.14

设置

  • 由Terraform管理的API网关,使用OpenAPI Spec定义
  • Cognito授权者

我正在尝试为我的API中的方法指定授权者。我可以使用控制台来做到这一点(有据可查):

Manual Cognito Authorizer

问题

我希望能够使用OpenAPI规范以编程方式进行设置。 AWS的相关文档为here

它表示您可以通过指定以下内容在OpenAPI规范中创建Authorizer对象:

securitySchemes:
  NameOfCognitoAuthorizer:
    type: apiKey
    name: Authorization
    in: header
    x-amazon-apigateway-authtype: cognito_user_pools
    x-amazon-apigateway-authorizer:
      type: cognito_user_pools
      providerARNs:
      - 'arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}'

这按预期工作。

然后,一旦完成,您应该能够将Authorizer应用于资源方法,如下所示:

post:
  summary: Create a new Item
  responses:
    '200':
      description: Ok
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Item'
  security:
    - NameOfCognitoAuthorizer:

但是,一旦我应用了更改并在AWS控制台中检查了post方法,就可以看到Authorizer尚未应用于API方法。谁能看到我做错了吗?

为完整起见,我的API是使用terraform创建的:

resource "aws_api_gateway_rest_api" "this" {
  name        = "MyAPI"
  body        = "${file("./api-spec.yaml")}"

  endpoint_configuration {
    types = ["REGIONAL"]
  }
}

2 个答案:

答案 0 :(得分:1)

我有同样的问题。这是一个有效的OpenAPI规范示例:

openapi: 3.0.0
info:
  title: Sample API
  description: api description here
  version: '0.1'
paths:
  /:
    get:
      summary: Describe the endpoint
      responses:
        '200':
          description: "All good"
      security:
        - EndpointAuthorizer: ["test/read"]
      x-amazon-apigateway-integration:
        uri: arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/arn:aws:lambda:{region}:{account_id}:function:{function_name}/invocations
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"
components:
  securitySchemes:
    EndpointAuthorizer:
      type: apiKey
      name: Authorization
      in: header
      x-amazon-apigateway-authtype: cognito_user_pools
      x-amazon-apigateway-authorizer:
        type: cognito_user_pools
        providerARNs:
          - arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}

密钥是端点上的安全性参考(注意test/read这是我在Cognito上定义的范围,但是可以使用空数组[]):

      security:
        - EndpointAuthorizer: ["test/read"]

在上面的定义中,AWS将导入EndpointAuthorizer中定义的Cognito Authorizer(在我的情况下为components.securitySchemes),但是您可以根据需要使用Terraform来创建它(只要确保您可以将其从OpenAPI规范中删除)

答案 1 :(得分:0)

我遇到了同样的问题,我发现这是由于我在方法上设置了security属性所致。

AWS docs中提供的JSON示例为:

"security": [
  {
    "MyUserPool": []
  }
],

在YAML中,其翻译为:

security:
- MyUserPool: []

请注意空数组的显式设置。希望这也能为您解决。