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 个观众,那么它应该是一个用逗号分隔的字符串。观众之间不允许有空格。
我正在使用 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 个观众,那么它应该是一个用逗号分隔的字符串。观众之间不允许有空格。