工具
设置
我正在尝试为我的API中的方法指定授权者。我可以使用控制台来做到这一点(有据可查):
问题
我希望能够使用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"]
}
}
答案 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: []
请注意空数组的显式设置。希望这也能为您解决。