GCP API 网关 JWT 总是返回 403

GCP API Gateway JWT always returning 403

我正在使用 gcp api 网关进行 JWT 身份验证。从我的身份验证服务生成令牌然后将其放入邮递员之后,无论我在令牌的 'aud' 部分中放入什么内容,我总是会收到此响应:

这是我打开的 api 文件:

# openapi2-run.yaml
swagger: '2.0'
info:
  title: my-gateway-id
  description: Sample API on API Gateway with a Cloud Run backend
  version: 1.0.0
schemes:
  - https
produces:
  - application/json
x-google-backend:
  address: https://my-cloud-run.a.run.app
  jwt_audience: https://my-cloud-run.a.run.app
securityDefinitions:
  jwt_auth:
    authorizationUrl: ''
    flow: 'implicit'
    type: 'oauth2'
    x-google-issuer: 'id-admin@my-project.iam.gserviceaccount.com'
    x-google-jwks_uri: 'https://www.googleapis.com/service_accounts/v1/metadata/x509/id-admin@my-project.iam.gserviceaccount.com'
paths:
  /:
    post:
      security:
        - jwt_auth: []
      summary: GraphQL endpoint
      operationId: gql
      responses:
        '200':
          description: A successful response
          schema:
            type: object

我看了一遍又一遍的文档,看不出发生了什么?提前致谢。

您得到 403,因为您生成的 JWT 令牌上的 aud 在您的 API 配置的 securityDefinitions 中找不到。

To allow additional client IDs to access the backend service, you can specify the allowed client IDs in the x-google-audiences field by using comma-separated values. API Gateway then accepts the JWTs with any of the specified client IDs in the aud claim.

转到 here 并粘贴您的令牌以查看您的 JWT“aud”声明。如果您使用 gcloud auth 生成 ID 令牌,aud 很可能是像 1234567890.apps.googleusercontent.com 这样的客户端 ID。但是,如果您使用自己的服务生成令牌,那么它将取决于您指定的目标受众。

要解决此问题,请在 securityDefinitions 部分添加 x-google-audiences 字段,该值应与您的 JWT“aud”声明匹配。

假设您的 JWT 令牌上的 aud 是云 运行 服务端点,那么您的 API 配置应如下所示。请随时查看 documentation 作为附加参考:

x-google-backend:
  address: https://my-cloud-run.a.run.app 
securityDefinitions:
  jwt_auth:
    authorizationUrl: ''
    flow: 'implicit'
    type: 'oauth2'
    x-google-issuer: 'id-admin@my-project.iam.gserviceaccount.com'
    x-google-jwks_uri: 'https://www.googleapis.com/service_accounts/v1/metadata/x509/id-admin@my-project.iam.gserviceaccount.com'
    x-google-audiences: 'https://my-cloud-run.a.run.app'

如果您有 multiple 个观众,那么它应该是一个用逗号分隔的字符串。观众之间不允许有空格。