GCP API Gateway JWT 总是返回 403

Posted

技术标签:

【中文标题】GCP API Gateway JWT 总是返回 403【英文标题】:GCP API Gateway JWT always returning 403 【发布时间】:2021-06-27 22:00:59 【问题描述】:

我正在使用 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

我一遍又一遍地查看文档,但看不到发生了什么?提前致谢。

【问题讨论】:

【参考方案1】:

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

要允许其他客户端 ID 访问后端服务,您可以使用逗号分隔值在 x-google-audiences 字段中指定允许的客户端 ID。 API Gateway 然后接受具有 aud 声明中任何指定客户端 ID 的 JWT。

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

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

假设您的 JWT 令牌上的 aud 是 Cloud Run 服务端点,那么您的 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 观众,那么它应该是一个用逗号分隔的字符串。观众之间不允许有空格。

【讨论】:

以上是关于GCP API Gateway JWT 总是返回 403的主要内容,如果未能解决你的问题,请参考以下文章

GCP API Gateway:路径参数作为查询参数传递

无权访问此资源/API (GCP)

Lumen JWT Auth登录成功后总是在其他路由返回401

AWS API Gateway 身份验证错误 IncompleteSignatureException 使用带有 Auth0 的 JWT

流明,身份验证尝试总是返回 false(jwt 或 auth)

有没有办法更改 Amazon API Gateway 返回的 http 状态代码?