Google API网关+Firebase:X-Apigateway-API-Userinfo vs X-Forward



我正在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未转发原始授权标头

最新更新