如何使用 Vue + Firebase 创建路由守卫 (Google Identity Platform)

How to create a route guard with Vue + Firebase (Google Identity Platform)

我已经在我的 Vue 项目中实施了 Firebase(又名 Google 身份平台)。我想保护特定路线,所以我添加了以下内容:

// router/index.js

    {
        path: '/profile',
        name: 'Profile',
        component: Profile,
        beforeEnter: (to, from, next) => {
            if (firebase.auth().currentUser) {
                next()
            } else {
                next({
                    path: '/login',
                })
            }
        }
    },

这行得通!但是,如果我对每条路线都这样做,它将变得难以管理。

为了使它整洁,我尝试将它放入一个函数中(在路由文件中并在外部尝试)但是它不起作用,因为在解析它时 Firebase 尚未初始化,因此它会抛出错误说要先初始化 Firebase。

Firebase 已在我的 main.js 文件中初始化:

// main.js

// Firebase configuration
var firebaseConfig = {
  // Config details redacted
};

// Initialize Firebase
firebase.initializeApp(firebaseConfig);

理想情况下,我所追求的是类似于 Auth0 在 SDK 示例中提供的东西:

// router/index.js

//...some route
beforeEnter: authGuard()

然后 authGuard 将在外部文件中。该文件将包含检查用户是否通过身份验证的功能。然后我可以根据需要将它添加到路由中。

使用 beforeEach 路由器钩子并检查路由元数据。这是我的一个应用程序的示例代码

let router = new Router({
routes: [
    {path: '*', redirect: "/"},
    {
        path: "/",
        name: 'login',
        component: Login
    },
    {
        path: "/register",
        name: 'register',
        component: Register,
    },

    {
        path: "/home",
        name: "home",
        component: Home,
        meta: {
            requiresAuth: true
            }
      }


        ]

    },

],
mode: 'history'

})

router.beforeEach((to, from, next) => {
let currentUser = firebase.auth().currentUser;
console.log("firebasedata",currentUser);
if (to.matched.some(record => record.meta.requiresAuth)) {

    if (!currentUser) {
        next({
            path: '/login',
            query: {redirect: to.fullPath}
        })
    } else {
        if(to.matched.some(record => record.name==='login')){
            next({
                path: '/home',
                query: {redirect: to.fullPath}
            })

        }
        else {
            next();
        }

    }

} else {

    next();
}

})

export default router