1

我是 NuxtJS 的新手并且遇到问题,我正在尝试获取从网站登录的用户的令牌,该令牌存储在 cookie 中,但是,当我启动或重新加载网站页面时(使用 nuxt ssr (通用)),nuxtServerInit 应该并且确实启动了,但是 req.headers.cookie 说它是未定义的,因此无法将数据加载到存储中。如果我重新加载页面,cookie 仍然在浏览器中并且一切都很完美,问题是 req.headers.cookie 是:未定义,为什么?啊,在开发中它工作得很好,但在生产中它不起作用(在 nuxtServerInit 中 req.headers.cookie 没有定义)

我正在使用 Firebase 托管、云功能、身份验证、云 Firestore。

这是代码:

// store/index.js

import { getUserFromCookie, getUserFromSession } from '../helpers/index.js'

export const actions = {

    async nuxtServerInit({ app, dispatch }, { req, beforeNuxtRender }) {

        console.log('req.headers.cookie: ' + req.headers.cookie)
        console.log('req.session: ', req.session)

        if (process.server) {
            const user = getUserFromCookie(req)
            console.log('process.server: ' + process.server)
            console.log('user: ', user)
            if (user) {
                await dispatch('modules/user/setUSER', {
                    name: !!user.name ? user.name : '',
                    email: user.email,
                    avatar: !!user.picture ? user.picture : '',
                    uid: user.user_id
                })
                await dispatch('modules/user/saveUID', user.user_id)
            } else {
                await dispatch('modules/user/setUSER', null)
                await dispatch('modules/user/saveUID', null)
            }
        }
    }

}

// helpers/index.js

import jwtDecode from 'jwt-decode'
var cookieparser = require('cookieparser')

export function getUserFromCookie(req) {
    if(req.headers.cookie){
        const parsed = cookieparser.parse(req.headers.cookie)
        const accessTokenCookie = parsed.access_token
        if (!accessTokenCookie) return

        const decodedToken = jwtDecode(accessTokenCookie)
        if (!decodedToken) return

        return decodedToken
    }

    return null
}

// pages/auth/signup.vue

<script>
import { mapActions } from 'vuex'

export default {
  data () {
    return {
      email: '',
      password: '',
      renderSource: process.static ? 'static' : (process.server ? 'server' : 'client')
    }
  },
  middleware: ['handle-login-route'],
  methods: {
    ...mapActions('modules/user', [ 'login' ]),
    async signUp () {
      try {
        const firebaseUser = await this.$firebase.auth().createUserWithEmailAndPassword(this.email, this.password)
        await this.writeUserData(firebaseUser.user.uid, firebaseUser.user.email)
        await this.login(firebaseUser.user)
        this.$router.push('/protected')
      } catch (error) {
        console.log(error.message)
      }
    },
    writeUserData (userId, email) {
      const db = this.$firebase.firestore()

      return db.collection("Usuarios").doc(userId).set({
        email: email
      })
    }
  }
}
</script>
// store/modules/user.js

export const actions = {

    async login({ dispatch, state }, user) {
        console.log('[STORE ACTIONS] - login')
        const token = await this.$firebase.auth().currentUser.getIdToken(true)
        const userInfo = {
            name: user.displayName,
            email: user.email,
            avatar: user.photoURL,
            uid: user.uid
        }

        Cookies.set('access_token', token) // saving token in cookie for server rendering
        await dispatch('setUSER', userInfo)
        await dispatch('saveUID', userInfo.uid)
        console.log('[STORE ACTIONS] - in login, response:', status)

    },

    async logout({ commit, dispatch }) {
        console.log('[STORE ACTIONS] - logout')
        await this.$firebase.auth().signOut()

        Cookies.remove('access_token');
        commit('setUSER', null)
        commit('saveUID', null)
    },

    saveUID({ commit }, uid) {
        console.log('[STORE ACTIONS] - saveUID')
        commit('saveUID', uid)
    },

    setUSER({ commit }, user) {
        commit('setUSER', user)

    }

}

非常感谢!:D

4

1 回答 1

0

如果您在 Firebase 上托管它,您应该将您的 cookie 重命名为“__session”,这是您可以在 Firebase 上使用的唯一名称。他们的文档应该很清楚!更改以下部分:

// helpers/index.js
const parsed = cookieparser.parse(req.headers.cookie)
const accessTokenCookie = parsed.__session


// store/modules/user.js
Cookies.set('__session', token)
于 2021-04-06T16:56:57.070 回答