Google API Gateway + Firebase:X-Apigateway-Api-Userinfo 与 X-Forwarded-Authorization 标头

Jas*_*son 2 http-headers node.js firebase firebase-authentication google-api-gateway

我在我的 Firebase 应用程序中使用 Google API Gateway 来验证用户是否已登录。在 API Gateway 的文档中建议使用转发的X-Apigateway-Api-Userinfo标头来检索用户信息:

API Gateway会将X-Apigateway-Api-Userinfo中的认证结果发送给后端API。建议使用此标头代替原始的 Authorization 标头。此标头采用 base64url 编码并包含 JWT 有效负载。

因为它是 base64url 编码的,所以我需要额外的服务器端逻辑来解码它,只是为了获取登录用户的信息(我假设解码的对象对应于 Firebase Auth Admin SDK 的DecodedIdToken)。

另一方面,我发现API Gateway虽然修改了原始Authorization标头,但它首先将其复制到另一个名为X-Forwarded-Authorization. 这意味着我可以做类似的事情:

// authHeaders = 'Bearer ...'
const authHeaders = headers['X-Forwarded-Authorization'];

const token = authHeaders.split(' ')[1]

const decodedToken = await admin.auth().verifyIdToken(token)
Run Code Online (Sandbox Code Playgroud)

我发现这是获取相同信息的更简单(并且有更好记录)的方法。这是一个坏主意吗?我不确定是否还有其他原因X-Apigateway-Api-Userinfo推荐使用标题。

小智 6

API 网关标头的X-Apigateway-Api-Userinfo工作方式与 Cloud Endpoints 相同X-Endpoint-API-UserInfo,后者为您验证 JWT 签名并仅存储您可以信任的 JWT 负载。

如果您想再次或自己进行身份验证,您可以读取X-Forwaded-Authorization并最终解码为 JWT 有效负载。仅当您想要使用绕过这些 API 网关服务的伪造来仔细检查对 HTTP 标头函数的请求时,这才有意义X-Apigateway-Api-Userinfo。您可以使用 IAM 来保护您的功能。

总而言之,

  • 您不需要验证 firebase JWT 令牌,因为 API 网关会为您完成此操作。
  • 验证后的 JWT 负载保存为X-Apigateway-Api-Userinfo
  • 您需要解码 Base64 编码的有效负载字符串。

参考:

指定 x-google-backend 时,ESPv2 不转发原始授权标头