首页 > 解决方案 > 为什么需要前端存储 Firebase 令牌?

问题描述

我正在制作一个网络应用程序。前端是反应,服务器端是rails api,我使用firebase身份验证。现在,每当调用 rails api 时,我都会获得 firebase 令牌并设置授权标头,如下所示。

client.interceptors.request.use(
  async (config) => {
    config.headers['Content-type'] = 'application/json'
    config.withCredentials = true
    var token = await firebaseApp.auth().currentUser?.getIdToken()
    config.headers['Authorization'] = `Bearer ${token}`
    return config
  },
  (error: AxiosError) => {
    throw new Error(error.message)
  }
)

但是,我找到了一些存储令牌的方法,不安全的本地存储,http only cookie。为什么需要前端存储 Firebase 令牌?每次调用rails api都获取token不好吗?

标签: ruby-on-railsreactjsfirebasefirebase-authenticationrails-api

解决方案


Firebase ID 令牌基本上是JWT,由 Firebase 签名。现在想象一个场景,您需要识别服务器中的用户。您可能会在 HTTP 请求中传递用户的 UID,这是不安全的,因为这很容易被暴力破解,除非您的服务器中有某种​​速率限制。

我说的签名是什么意思?

JWT 看起来像:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

上面 JWT 中存储的数据是:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

您需要使用 Firebase Admin SDK验证这些 Firebase IDToken。我不知道这是否适用于 Ruby,但值得检查上面的链接。

验证这些将返回一个带有用户身份验证信息的对象,或者如果这是一个无效的 JWT,则会返回一个错误。您必须始终在您的 REST 请求中将此 JWT 传递给您的服务器,因为这些无法被暴力破解。任何人都可以制作具有相同内容的 JWT (IDToken),但他们不知道您的签名。他们需要您的 Firebase 服务帐户凭据才能执行此操作。

此外,JWT 最终会过期(我假设一个小时后)。所以一次又一次的拿到token也不错。这就是他们的目的。短期访问。

我建议您观看此JWT 教程。只需确保将 idToken 传递给您的 REST API 以验证用户而不是他们的 UID。


推荐阅读