我部署了一个Google Cloud API网关,用于向云运行服务发送请求。
cloud run服务托管了一个laravel docker容器镜像,为了对我的认证页面进行认证,我需要发送一个Authorization头(Authorization: Bearer my-user-token-here
)。
当我将请求直接发送到云运行服务时,我能够获得所需的响应,并设置了Authorization头。但是,当我通过API网关发送请求时,我总是收到一条未经身份验证的消息,显示在对云运行的api请求中缺少头部。我不确定这一点。
我在google cloud API gateway上找不到任何有用的文档来建议cloud run是否会删除header。
我也不确定这个错误是否来自openapi. yaml。到目前为止,我意识到我不能使用openapi文档的v3,而是v2,因为api网关不支持v2。在openapi文档的v2中,securityDefinitions不支持Authorization header Bearer token,而是支持Authorization header basic。
我的Openapi yaml
# openapi2-run.yaml
swagger: "2.0"
info:
title: my-api
description: my custom api
version: 1.0.0
schemes:
- https
produces:
- application/json
consumes:
- application/json
x-google-backend:
address: https://some-cloud-run-url
basePath: /api
host: my-api.nw.gateway.dev
x-google-endpoints:
- name: "my-api.nw.gateway.dev"
allowCors: True
paths:
/user:
get:
summary: Requested user details.
operationId: UserDetails
responses:
"200":
description: Return Requested User Details.
schema:
type: string
"default":
description: Unexpected error
字符串
令人惊讶的事实是,如果我在本地或直接向云运行发送请求,它会工作,我不会得到任何身份验证错误,但当我使用api-gateway时,我会得到错误。因此,我猜测这与请求到达云运行时头部丢失有关,可能是因为我这里的yaml定义没有授权头部。
3条答案
按热度按时间ar5n3qh51#
我们有一个API网关示例,它向云函数发送请求。
如果任何传入的请求具有
Authorization
报头,则网关将报头细节Map到云函数的请求中的X-Forwarded-Authorization
报头。我假设对Cloud Run的请求也是一样的。我没有任何经验与Laravel知道,如果它有选项,看看在转发头,虽然。
qc6wkl3g2#
实际上,您可以通过在
x-google-backend
中设置disable_auth
来忽略它。该文件是不是在谷歌网关,但在谷歌端点如下。https://cloud.google.com/endpoints/docs/openapi/openapi-extensions
该文件称:
配置目标后端时,如果满足以下任一条件,则可能不希望使用IAP或IAM对来自ESPv 2的请求进行身份验证:
后端应该允许未经身份验证的调用。
后端需要API客户端的原始Authorization头,不能使用X-Forwarded-Authorization(在jwt_audience部分有说明)。
因此,在您的特定情况下,您只需要像这样修改单个块:
字符串
它会像一个魅力。
请注意,一旦您决定自己进行授权,您就不能在网关配置中设置
securityDefinitions
。如果你这样做gcp网关会抛出401。k4aesqcs3#
的数据
能够解决它使用下面的片段所提到的payon.附加屏幕截图与工作语法。