0

我在我的 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 修改了原始Authorizationheader,但它首先将其复制到另一个名为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建议使用标题。

4

1 回答 1

2

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

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

总而言之,

  • 您不需要验证 Firebase JWT 令牌,因为 API 网关会为您执行此操作。
  • 已验证的 JWT 有效负载另存为X-Apigateway-Api-Userinfo
  • 您需要解码 base64 编码的有效负载字符串。

参考:

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

于 2021-08-19T03:17:59.283 回答