在静态模式下使用 Nuxt 和 Firebase Nuxt 模块验证中间件

时间:2021-06-09 18:48:11

标签: firebase firebase-authentication nuxt.js middleware

我正在尝试在 Nuxt 应用(静态)中实现 Firebase。我安装了@nuxtjs/firebase,配置了它,并使它与 auth 一起工作(登录和注销都有效)。我想在登录后锁定整个应用程序。

但是当我启用中间件时,应用程序崩溃了。 这是因为,我认为,为了使模块在 SSR 中工作,还有一些额外的步骤要做。我认为在服务器中,由于未设置用户,中间件会触发重定向,对吗? 我怎样才能实现一个有效的中间件?

中间件代码 auth.js

export default function ({ store, redirect }) {
    if (!store.state.user) {
        return redirect('/login')
    }
}

商店代码 index.js

export const state = () => ({
    user: null,
    userData: {}
})

export const getters = {

}

export const mutations = {
    onAuthStateChangedMutation(state, {authUser}){
        if (!authUser) {
            state.user = null
        } else {
            const { uid, email } = authUser
            state.user = { uid, email }        
        }
    },

    setUserData(state, payload){
        state.userData = payload
    }
}

export const actions = {
    async onAuthStateChangedAction({commit}, {authUser}){
        if (!authUser) {
            state.userData = {}
        } else {
            try{
                const userRef = await this.$fire.firestore.collection('users').doc(authUser.uid).get()
                const userData = await userRef.data()
                commit('setUserData', userData)
            }
            catch(e){
                console.log(e)
            }
        }
    }
}

nuxt.config

  firebase: {
    services:{
      auth:{
        ssr: true,
        initialize:{
          onAuthStateChangedMutation: 'onAuthStateChangedMutation',
          onAuthStateChangedAction: 'onAuthStateChangedAction',
        }
      },
      firestore: true,
      analytics: true
    }
  },
  
  router:{
    middleware: 'auth'
  }

1 个答案:

答案 0 :(得分:0)

我设法使它工作,合并了关于 nuxtjs firebase 文档和我的用例的信息。如果有人有更好的想法或发现我的解决方案中的漏洞,请随时贡献:

商店代码 index.js

export const state = () => ({
    user: null,
    userData: null,
    isUserReady: false
})

export const getters = {

}

export const mutations = {
    onAuthStateChangedMutation(state, {authUser}){
        if (!authUser) {
            state.user = null
        } else {
            const { uid, email } = authUser
            state.user = { uid, email }
        }
    },

    clearUserData(state){
        state.isUserReady = false
        state.userData = null
    },

    setUserData(state, payload){
        state.userData = payload
        state.isUserReady = true
    }
}

export const actions = {
    async nuxtServerInit({ commit }, { res }) {
        if (res && res.locals && res.locals.user) {
            const { ...authUser } = res.locals.user
            commit('onAuthStateChangedMutation', { authUser })
        }
    },

    async onAuthStateChangedAction({commit}, {authUser}){
        if (!authUser) {
            commit('clearUserData')
        } else {
            try{
                const userRef = await this.$fire.firestore.collection('users').doc(authUser.uid).get()
                const userData = await userRef.data()
                commit('setUserData', userData)
            }
            catch(e){
                console.log(e)
            }
        }
    }
}

nuxt.config.js

  firebase: {
    config:{
      ...
    },
    services:{
      auth:{
        initialize:{
          onAuthStateChangedMutation: 'onAuthStateChangedMutation',
          onAuthStateChangedAction: 'onAuthStateChangedAction',
        }
      },
      firestore: true,
    }
  },

  pwa: {
    manifest: {
      lang: 'en'
    },
    workbox: {
      importScripts: [
        '/firebase-auth-sw.js'
      ],
      dev: true
    }
  }

通过这些设置,我能够在 Netlify 上部署应用程序 (ssr: false, target: "static"),并且用户可以登录,即使页面重新加载,登录也是持久的。