为什么需要前端存储firebase代币



我正在制作一个web应用程序。前端是react,服务器端是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 cookie的方法。为什么需要前端存储firebase代币?每次调用rails-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最终会过期(我想一个小时后(。所以,一次又一次地获得代币也不错。这就是他们的目的。短期访问。

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

最新更新