Google API 网关 + Firebase:X-Apigateway-Api-Userinfo 对比 X-Forwarded-Authorization headers
Google API Gateway + Firebase: X-Apigateway-Api-Userinfo vs X-Forwarded-Authorization headers
我在我的 Firebase 应用程序中使用 Google API 网关来验证用户是否 signed-in。在API网关的文档here中,推荐使用转发的X-Apigateway-Api-Userinfo
header获取用户信息:
API Gateway will send the authentication result in the X-Apigateway-Api-Userinfo to the backend API. It is recommended to use this header instead of the original Authorization header. This header is base64url encoded and contains the JWT payload.
因为它是 base64url 编码的,我需要额外的 server-side 逻辑来解码它,只是为了获取 logged-in 用户的信息(我假设解码后的 object 对应于 Firebase Auth管理 SDK 的 DecodedIdToken)).
另一方面,我发现虽然API网关修改了原来的Authorization
header,但它首先将其复制到另一个名为X-Forwarded-Authorization
的header ].这意味着我可以做类似的事情:
// authHeaders = 'Bearer ...'
const authHeaders = headers['X-Forwarded-Authorization'];
const token = authHeaders.split(' ')[1]
const decodedToken = await admin.auth().verifyIdToken(token)
我发现这是获取相同信息的一种更简单(并且 better-documented)的方法。 这是个坏主意吗? 我不确定是否还有其他原因建议使用 X-Apigateway-Api-Userinfo
header。
API 网关 header X-Apigateway-Api-Userinfo
与 Cloud Endpoints X-Endpoint-API-UserInfo
的工作方式相同,后者为您验证 JWT 签名并仅存储您可以信任的 JWT 负载。
如果你想再次或自己做认证,你可以阅读X-Forwaded-Authorization
,最后解码成JWT payload。这仅在您想要使用绕过这些 API 网关服务的伪造 X-Apigateway-Api-Userinfo
仔细检查对 HTTP 标头函数的请求时才有意义。您可以使用 IAM 来保护您的功能。
总而言之,
- 您不需要验证 firebase JWT 令牌,因为 API 网关会为您完成。
- 经过验证的 JWT 负载保存为
X-Apigateway-Api-Userinfo
- 您需要解码 base64 编码的有效负载字符串。
参考:
ESPv2 not forwarding original Authorization header when an x-google-backend is specified
我在我的 Firebase 应用程序中使用 Google API 网关来验证用户是否 signed-in。在API网关的文档here中,推荐使用转发的X-Apigateway-Api-Userinfo
header获取用户信息:
API Gateway will send the authentication result in the X-Apigateway-Api-Userinfo to the backend API. It is recommended to use this header instead of the original Authorization header. This header is base64url encoded and contains the JWT payload.
因为它是 base64url 编码的,我需要额外的 server-side 逻辑来解码它,只是为了获取 logged-in 用户的信息(我假设解码后的 object 对应于 Firebase Auth管理 SDK 的 DecodedIdToken)).
另一方面,我发现虽然API网关修改了原来的Authorization
header,但它首先将其复制到另一个名为X-Forwarded-Authorization
的header ].这意味着我可以做类似的事情:
// authHeaders = 'Bearer ...'
const authHeaders = headers['X-Forwarded-Authorization'];
const token = authHeaders.split(' ')[1]
const decodedToken = await admin.auth().verifyIdToken(token)
我发现这是获取相同信息的一种更简单(并且 better-documented)的方法。 这是个坏主意吗? 我不确定是否还有其他原因建议使用 X-Apigateway-Api-Userinfo
header。
API 网关 header X-Apigateway-Api-Userinfo
与 Cloud Endpoints X-Endpoint-API-UserInfo
的工作方式相同,后者为您验证 JWT 签名并仅存储您可以信任的 JWT 负载。
如果你想再次或自己做认证,你可以阅读X-Forwaded-Authorization
,最后解码成JWT payload。这仅在您想要使用绕过这些 API 网关服务的伪造 X-Apigateway-Api-Userinfo
仔细检查对 HTTP 标头函数的请求时才有意义。您可以使用 IAM 来保护您的功能。
总而言之,
- 您不需要验证 firebase JWT 令牌,因为 API 网关会为您完成。
- 经过验证的 JWT 负载保存为
X-Apigateway-Api-Userinfo
- 您需要解码 base64 编码的有效负载字符串。
参考:
ESPv2 not forwarding original Authorization header when an x-google-backend is specified