我使用的是firebase身份验证,我的导航栏取决于用户是否登录。当我加载网站时,如果用户之前没有注销,他应该仍然保持登录状态。但是,Firebase onAuthStateChanged侦听器在100- 300 ms后返回用户,所以我的导航栏无法确定用户是否登录。因此,导航栏显示登录和注册按钮300 ms,然后firebase返回用户,导航栏显示 Jmeter 板和注销按钮。
我正在使用vue,我尝试过在本地存储器上保存UID和用户名,但我担心安全性。如果有人手动更改了本地存储器数据会怎么样?此外,用户可能会注销,但仍然登录在我手动设置的localStorage.setItem('user',....)
Navbar.vue
<div v-if="user.uid" class="flex row space-b">
// userpic, photo, logout button
</div>
<div v-else>
// login and signup button
</div>
武埃克斯
state: {
user: {
uid: null,
photoURL: null,
username: null,
},
},
我试着不挂载Vue示例,直到onAuthStateChanged侦听器返回一些东西,但这不是一个好的解决方案,因此我渲染网站近300毫秒晚。
3条答案
按热度按时间6bc51xsx1#
无论如何,我把它保存在cookie中。当网站加载时,如果cookie存在,我会呈现导航栏,就像用户登录一样,然后在Firebase侦听器返回后仔细检查
xnifntxz2#
这是因为beforeEach在firebase完全完成初始化之前执行。
您可以使用onAuthStateChanged观察器来确保仅在firebase完全初始化之后才初始化vue应用。
修复它的一种方法是使用onAuthStateChanged将vue初始化代码 Package 在main.js(new Vue(...))中,如下所示:
对于版本7 firebase,您可以检查此存储库文件https://github.com/ErikCH/FirebaseTokenFrontend/blob/master/src/main.js
vlju58qv3#
@Abdullah Alhariri给出的answer可以工作。但是,它会阻止VUE加载,除非firebase auth已经初始化。这可能会导致用户长时间黑屏。这里有一个解决方案(灵感来自LearnVue的this video。
main.js文件不应包含对firebase的任何导入或引用。
在
src/helper
文件夹中添加firebase.js
,在该文件中,我们正在设置firebase项目和auth,重要部分是getCurrentUser()
函数,该函数将在router.js中使用在
router.js
中,对于每条路由,使用meta
定义哪些路由需要认证,然后在router.beforeEach()
(即路由器保护)中使用getCurrentUser()
函数。注意:使用
async
作为router.beforeEach(),这样可以确保只有在初始化firebase auth之后才能导航路由。