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的主要内容,如果未能解决你的问题,请参考以下文章
Lumen JWT Auth登录成功后总是在其他路由返回401
AWS API Gateway 身份验证错误 IncompleteSignatureException 使用带有 Auth0 的 JWT