JS+Firebase开发:如何校验用户存在并分配专属身份token
Firebase用户Token自动关联实现方案(入门友好)
前置调整:先补全数据库存储结构
你现有的messages节点完全不用改动,只需要在数据库根节点新增一个users节点专门存用户和token的映射关系就行,最终结构参考:
{ "users": { "输入的用户名A": { "token": "你生成的32位随机字符串", "createTime": 1718000000000 }, "输入的用户名B": { "token": "你生成的32位随机字符串", "createTime": 1718000100000 } }, "messages": { // 保持你原来的双向聊天存储结构,不用改 } }
核心实现代码
把这段逻辑插在你prompt获取到用户输入的用户名之后、初始化聊天监听逻辑之前就行,所有注释都对应你提的三个需求点:
// 这行是你原来写的获取用户名的代码,不用改 const currentUsername = prompt('请输入你的用户名') // 初始化用户的异步函数,Firebase读写是异步操作,必须加async async function initUserAuth(username) { // 定位到对应用户名的数据库存储路径 const userDbRef = db.ref(`users/${username}`) // 读取该路径下的已有数据 const userDataSnap = await userDbRef.get() let activeToken // 需求a:判断用户是否存在 if (userDataSnap.exists()) { // 需求b:用户存在,直接取已经绑定的token activeToken = userDataSnap.val().token console.log('匹配到已存在用户,token:', activeToken) } else { // 需求c:用户不存在,调用你已经写好的函数生成新token activeToken = generateAToken() // 把新用户和token的映射写入数据库 await userDbRef.set({ token: activeToken, createTime: Date.now() }) console.log('新用户创建完成,分配token:', activeToken) } // 把当前用户的信息存在浏览器本地,刷新页面不用重复查库,后续发消息、传文件直接调用 localStorage.setItem('currentUserInfo', JSON.stringify({ username: username, token: activeToken })) // 等token逻辑全部跑完,再执行你原来写的聊天初始化、消息监听逻辑,避免拿不到token // 这里把initChat替换成你自己原来写的初始化聊天功能的函数名就行 initChat() } // 执行初始化逻辑 initUserAuth(currentUsername)
新手避坑提示
- 所有Firebase的
get()、set()操作前面必须加await,不然会出现代码已经往下跑了,数据库数据还没读回来的问题,拿到的都是undefined - 刚开始调试如果报权限错误,可以先去Firebase控制台把实时数据库的规则临时改成允许读写,等功能跑通了再慢慢加权限限制,个人使用不用一开始就搞复杂的权限校验
- 等token逻辑验证正常后,你后续发消息的时候可以在消息体里多带一个
senderToken字段,之后就算用户改昵称,只要token不变就能匹配到历史消息,完全不用依赖用户名做身份识别 - 验证逻辑是否正常很简单:第一次输新用户名去Firebase控制台看
users节点有没有生成对应条目,刷新页面重输同一个用户名,看拿到的token和第一次生成的是不是完全一致,没有生成新条目就说明逻辑没问题
内容的提问来源于stack exchange,提问作者pmisrfvfpimm23
相关产品推荐
相关产品推荐

