Как создать защиту маршрута с помощью Vue Firebase (платформа идентификации Google)

#firebase #vue.js #firebase-authentication #google-identity

#firebase #vue.js #firebase-аутентификация #google-identity

Вопрос:

Я внедрил Firebase (он же. Платформа идентификации Google) в мой проект Vue. Я хочу защитить определенные маршруты, поэтому я добавил следующее:

 // 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 это было бы во внешнем файле. Этот файл будет содержать функцию, которая проверяет, аутентифицирован пользователь или нет. Затем я могу добавить его в маршруты по мере необходимости.

Комментарии:

1. Вы можете взглянуть на это руководство , в котором показан один из возможных подходов к приложению.

2. @RenaudTarnec хаха, я буквально только что нашел это руководство. Рефакторинг моей настройки, чтобы имитировать это. Спасибо.

Ответ №1:

Используйте перед подключением каждого маршрутизатора и проверьте метаданные маршрута. Вот пример кода из одного из моих приложений

 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
  

Ответ №2:

Импортируйте аутентификацию firebase из файла конфигурации firebase, проверьте, есть ли в кэше текущий аутентифицированный пользователь. есть ли тогда доступ ко всем маршрутам, если не использовать переменную «requiresAuth» для ограничения доступа

 import { auth } from '../plugins/firebase.js' //import auth from firebase config file

const routes = [
  {
    path: '/',
    component: () => import('@/layouts/default/Default.vue'),
    children: [
      {
        path: '',
        name: 'login',
        component: () => import('@/views/auth/Login.vue'),
      },
      {
        path: '/register',
        name: 'register',
        component: () => import('@/views/auth/Register.vue'),
      },
      {
        path: '/forgotPassword',
        name: 'forgotPassword',
        component: () => import('@/views/auth/ForgotPassword.vue'),
      },
      {
        path: '/app',
        name: 'app',
        component: () => import('@/views/app/Dashboard.vue'),
        meta: {
          requiresAuth: true // the route you want to protect
        },
      },
    ],
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
})

//Protection code
router.beforeEach((to, from, next) => {
  const requiresAuth = to.matched.some(x => x.meta.requiresAuth)
  const user = auth.currentUser

  if (requiresAuth amp;amp; !user) next('/')
  else if (requiresAuth amp;amp; user) next()
  else next()
})  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>