Firebase Nuxt中间件的用户重定向和身份验证

Firebase Nuxt中间件的用户重定向和身份验证,firebase,vue.js,nuxt.js,Firebase,Vue.js,Nuxt.js,如果用户在尝试使用以下代码访问某些页面时未登录,我将尝试将用户重定向到登录页面 //middlware/authenticated.js 从“firebase”导入firebase 导出默认函数({store,redirect}){ 让user=firebase.auth().currentUser store.state.user=user//这不起作用 如果(!用户){ console.log('重定向') 返回重定向(“/login”) } } 然而,当我刷新一个页面时,这个代码的问题是

如果用户在尝试使用以下代码访问某些页面时未登录,我将尝试将用户重定向到登录页面

//middlware/authenticated.js
从“firebase”导入firebase
导出默认函数({store,redirect}){
让user=firebase.auth().currentUser
store.state.user=user//这不起作用
如果(!用户){
console.log('重定向')
返回重定向(“/login”)
}
}
然而,当我刷新一个页面时,这个代码的问题是我被重定向到了登录页面,尽管没有使用中间件,我可以与登录页面保持在同一个页面上。出于某些原因,我不知道为什么,firebase不能在中间件中工作

我应该如何修改此中间件或实现此功能

谢谢

//中间件/authenticated.js
导出默认函数({
商店,
重新使用
}) {
如果(!store.getters['index/isAuthenticated']){
返回重定向(“/login”)
}
}
//post.vue
异步装入(){
if(process.browser){
让用户;
如果(!this.user)user=wait auth();//此auth是一个插件
等待承诺([
this.user?Promise.resolve():this.$store.dispatch(“setUser”,{user:user | | null})
]);
this.isLoaded=true;
}
},
//插件/auth.js
从“~/plugins/firebase”导入firebase
函数auth(){
返回新承诺((解决、拒绝)=>{
firebase.auth().onAuthStateChanged((用户)=>{
解析(用户| | false)
})
})
}
导出默认身份验证

默认情况下,Firebase在成功身份验证时保持用户登录状态。本例使用会话来存储用户uid和Cookie来存储用户令牌,并在会话已结束(例如浏览器关闭)然后新会话启动但用户仍根据Firebase进行身份验证的情况下使用。在这种情况下,用户无需登录即可查看受保护的资源

保护它的基本中间件应该如下所示(如果您有一个名为User的存储模块)

如果Cookie中保存了用户,请在中获取该用户,并将其加载到用户存储模块中,该模块将用于中间件中的验证

您的用户存储模块应该查看,并记住,在注销用户时删除Cookie,以便用户完全注销


我使用上面提到的内容作为身份验证的开始,并对其进行了一些修改,您也可以这样做。大部分的功劳都归功于davidroyer,他已经建立了一个包含所有需要的文件的示例,作为如何实现目标的一个很好的例子。

我也遇到了同样的问题,因为中间件已经发生在服务器端,当我带着解决方案回家时,我会给你一些代码,但我这里没有代码。哦,这太有用了!非常感谢你!好啊非常感谢你的回答。我尝试了你的代码,但仍然无法解决问题。我是否也需要实现会话和cookie?现在我只更改了authenticated.js,但现在发生的事情是,当我访问一个页面时,我被重定向到一个登录页面,在该页面中我设置了中间件(authenticated.js)@Masa是的,你需要自定义重定向到当权限丢失时你想要抛出的页面,是的,我忘了提到你需要一些npm包,比如jscookie,你可以在他的package.json中看到,只要通读github repo,看看他做了什么我也有一些启动问题,但如果设置得像他那样正确,它就会工作:)@Masa只要问我你有没有问题>>是的,你需要自定义重定向到当权限丢失时你想要扔到的页面真的吗?哦,事情似乎比我想象的要复杂得多。但我会努力的!>>只要问我你有什么问题,谢谢@Masa总的来说,代码不多,我还不在家,所以我不能给你一个你真正需要的小例子,但我希望你能找到自己的方法,一开始它看起来很复杂,但如果你得到它,一旦它看起来很简单
export default function ({ store, redirect }) {
  if (!store.getters['modules/user/isAuthenticated']) {
    return redirect('/auth/signin')
  }
}