ruby-on-rails - 为什么需要前端存储 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不好吗?
解决方案
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。
推荐阅读
- flutter - 如何使用rest api将谷歌用户(使用谷歌登录)数据保存到我的服务器中?
- python - 将特定行添加到文本文件
- android - 撰写布局垂直对齐:SpaceBetween 没有影响
- python - 在 metatrader 5 中使用 python 将数据插入 SQLite db
- python - 解决 Project Euler 问题 1 (Python)
- python - 将字节转换为 int16
- ruby - 并发保存多个数据时如何从数据库中获取价值
- animation - 在 Swift 中将 Rainbow like shimmer 动画应用于 UILabel
- flutter - TextFormField Flutter 中的前缀位置和大小
- crystal-reports - 在 Business Objects 中复制和粘贴表格时遇到问题,我怎样才能成功?