简体   繁体   English

Firebase 身份验证。 更新所有项目文件

[英]Firebase Auth. Update All Project File

The project is developed by client-side firebase and vue.该项目由客户端firebase和vue开发。 When user login successfully, my authService updated in login component.当用户登录成功时,我的 authService 在登录组件中更新。 But same object did not update in router.但是相同的对象没有在路由器中更新。 authService is used in Login component and AdminNavbar component.In my opinion, at each login and logout event, onAuthStateChanged methode will update user variable. authService 用于 Login 组件和 AdminNavbar 组件。在我看来,在每次登录和注销事件时,onAuthStateChanged 方法都会更新用户变量。 This is working on Login component, but not working on router.这适用于登录组件,但不适用于路由器。 For this reason app always redirect to login page.出于这个原因,应用程序总是重定向到登录页面。

firebase and authService side code is shared below: firebase 和 authService 端代码共享如下:

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';

const firebaseConfig = {
};

const firebaseApp = firebase.initializeApp(firebaseConfig);

const initializeAuth = new Promise(resolve => {
  firebase.auth().onAuthStateChanged(user => {
    authService.setUser(user);
    resolve(user);
    console.log(user); 
  })
})

const authService = {

  user: null,

  authenticated () {
    return initializeAuth.then(user => {
      return user && !user.isAnonymous
    })
  },

  setUser (user) {
    this.user = user
  },

  login (email, password) {
    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(function() {
      firebase.auth().signInWithEmailAndPassword(email, password)
    }).catch(function(error) {
      console.log(error);
    });
  },

  logout () {
    firebase.auth().signOut().then(() => {
      console.log('logout done')
    })
  }
}

export const db = firebaseApp.database();
export const hadithRef = db.ref('hadith');
export default authService;

router side code is shared below:路由器端代码共享如下:

import Vue from "vue";
import VueRouter from 'vue-router';

Vue.use(VueRouter);

// import components
import authService from './firebase.js';

const router = new VueRouter({
    mode: 'history',
    routes: [
      // this part is included path, name, components
    ]
});

router.beforeEach((to, from, next) => {
    // when user is login, user variable still is null. But same time user variable is not null in login component.
    // user is null at this point.
    console.log(authService.user);
    if (to.path == '/hadith/query' && authService.user == null) next({ path: '/login' })
    else if (to.path == '/hadith/add' && authService.user == null) next({ path: '/login' })
    else if (to.path == '/hadith/update' && authService.user == null) next({ path: '/login' })
    else next()
});

export default router;

main.js code is shared below: main.js 代码共享如下:

import Vue from 'vue'
import '@babel/polyfill'
import 'mutationobserver-shim'
import './plugins/bootstrap-vue';
import './plugins/vuefire';

Vue.config.productionTip = false;

import App from './App.vue';
import router from './plugins/hrouter';

new Vue({
  render: h => h(App),
  router
}).$mount('#app')

Solution is this link .解决方案是这个链接 As sharing below, we should use vuex and it's states setting in onAuthStateChanged observer method.作为下面的分享,我们应该使用 vuex 及其在 onAuthStateChanged 观察者方法中的状态设置。 At the same time we make persist to states of vuex.同时我们使持久化到 vuex 的状态。 You can view my github repo .你可以查看我的 github repo

modify onAuthStateChanged methode in your firebase file:修改 firebase 文件中的 onAuthStateChanged 方法:

import store from '../store/index';
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    store.dispatch('setUser', null);
  } else {
    store.dispatch('setUser', null);
  }
});

Also we install the vuex-persistedstate for persisted states:我们还为持久状态安装了 vuex-persistedstate:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import createPersistedState from "vuex-persistedstate";
export default new Vuex.Store({
  plugins: [createPersistedState()],
  state: {
    user: null
  },
    getters:{
      getUser: state => {
          return state.user;
      }
    },
  mutations: {
    setUser(state, user){
      state.user = user;
    }
  },
  actions: {
    setUser(context, user){
        context.commit('setUser', user);
    },
  }
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM