3

我正在尝试设置 Google API Gateway 以使用调用者在标头中发送的 API 密钥。
我的 api 配置 yaml 如下所示:

...
securityDefinitions:
  api_key_header:
    type: apiKey
    name: key
    in: header
  api_key_query:
    type: apiKey
    name: key
    in: query
paths:
  /foo-header:
    get:
      summary: Test foo endpoint
      operationId: testGet-header
      x-google-backend:
        address: "<backend address>"
        protocol: h2
        path_translation: APPEND_PATH_TO_ADDRESS
      security:
        - api_key_header: []
      responses:
        204:
          description: A successful response
  /foo-query:
    get:
      summary: Test foo endpoint
      operationId: testGet-header
      x-google-backend:
        address: "<backend address>"
        protocol: h2
        path_translation: APPEND_PATH_TO_ADDRESS
      security:
        - api_key_query: []
      responses:
        204:
          description: A successful response 

如果没有通过标头或查询参数提供有效的 API 密钥,我希望这两个调用都失败/foo-header并显示 401 状态。/foo-query

但实际上只是/foo-query按预期行事。即使请求标头中未提供 API 密钥,请求也会传递到后端
/foo-header

我的配置有问题,还是在请求标头中提供 API 密钥时 Google API Gateway 无法正常工作?

4

2 回答 2

5

什么时候inheadername应该是x-api-key

https://cloud.google.com/endpoints/docs/openapi/openapi-limitations#api_key_definition_limitations

于 2021-02-12T09:49:34.427 回答
0

当请求标头中提供 API 密钥时,Google API Gateway 似乎应该可以正常工作,因为 Google API Gateway 文档指出:

开发人员在 Cloud Console 的项目中生成 API 密钥,并将该密钥作为查询参数或请求标头嵌入到对 API 的每次调用中。

但是,我能够重现您报告的行为,因此我认为您的配置没有问题。

为此,我一直在关注 Google API Gateway 的 GCP快速入门,对其稍作修改,以便我的 OpenAPI 规范也有 2 个路径:一个是在查询参数中查找键,另一个是在请求标头中查找。

paths:
  /foo-header:
    get:
      summary: Test security
      operationId: headerkey
      x-google-backend:
        address: [MY_CLOUD_FUNCTION_1]
      security:
      - api_key_header: []
      responses:
        '200':
          description: A successful response
          schema:
            type: string
  /foo-query:
    get:
      summary: Test security
      operationId: querykey
      x-google-backend:
        address: [MY_CLOUD_FUNCTION_2]
      security:
      - api_key_query: []
      responses:
        '200':
          description: A successful response
          schema:
            type: string
securityDefinitions:
  # This section configures basic authentication with an API key.
  api_key_header:
    type: "apiKey"
    name: "key"
    in: "header"
  api_key_query:
    type: "apiKey"
    name: "key"
    in: "query"

就像你一样,/foo-header即使没有提供 API 密钥,我也可以看到传递给后端的请求。


我建议您在Public Issue Tracker上报告此问题,以便相应的 GCP 工程团队对其进行审核。

于 2021-01-27T17:07:54.853 回答