如何使用 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
我已经在我的 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