我正在Firebase应用程序中使用Google API网关来验证用户是否已登录。在API网关的文档中,建议使用转发的X-Apigateway-Api-Userinfo
头来检索用户信息:
API网关将在X-Apigateway-API-Userinfo中将身份验证结果发送到后端API。建议使用此标头,而不是原始的Authorization标头。此标头是base64url编码的,包含JWT有效载荷。
因为它是base64url编码的,我需要额外的服务器端逻辑来解码它,只是为了获得登录用户的信息(我假设解码的对象对应于Firebase Auth Admin SDK的DecodedIdToken)。
另一方面,我发现虽然API网关修改了原始的Authorization
头,但它首先将其复制到另一个名为X-Forwarded-Authorization
的头。这意味着我可以做一些类似的事情:
// authHeaders = 'Bearer ...'
const authHeaders = headers['X-Forwarded-Authorization'];
const token = authHeaders.split(' ')[1]
const decodedToken = await admin.auth().verifyIdToken(token)
我发现这是获得相同信息的一种更容易(并且有更好的文档记录)的方法这是个坏主意吗我不确定是否有其他原因推荐使用X-Apigateway-Api-Userinfo
标头。
API网关头X-Apigateway-Api-Userinfo
的工作原理与云端点X-Endpoint-API-UserInfo
相同,后者为您验证了JWT签名,并仅存储您可以信任的JWT有效负载。
如果您想再次进行身份验证或自己进行身份验证,可以读取X-Forwaded-Authorization
并最终解码为JWT有效载荷。只有当您想使用绕过这些API网关服务的伪造X-Apigateway-Api-Userinfo
来双重检查对HTTP headler函数的请求时,这才有意义。您可以使用IAM来保护您的功能。
总之,
- 您不需要验证firebase JWT令牌,因为API网关可以为您验证
- 验证的JWT有效载荷被保存为
X-Apigateway-Api-Userinfo
- 您需要对base64编码的有效载荷字符串进行解码
参考:
指定x-google-backend 时,ESPv2未转发原始授权标头