如何通过 nuxt ssr 设置谷歌用户的 cookie?

问题描述

如果您通过 firebase 使用 google 登录,我正在尝试设置 cookie。

这有点难以解释,但是当我从我的网站登录时,cookie 已设置,而当我转到另一条路线时,google 已设置,它仍然设置我什至打印了用户状态,并看到我得到了电子邮件和 uid 返回,但是当我刷新页面时出现错误Invalid token specified: Cannot read property 'replace' of undefined

所以我尝试调试它并得出的结论是这一行:if(!req.headers.cookie) return;错误的情况,或者我认为是因为谷歌也设置了一个 cookie,如果我用其他登录方法尝试这个我没有错误,但那是因为当我仅使用电子邮件和密码登录时,谷歌没有设置 cookie,然后我的 cookie 被设置。

这是我的代码

我的方法

sociallogin() {
            this.$store.dispatch('users/sociallogin').catch(err => {
                this.errmsg = err
            })
            this.$router.push('/')
        },

我的用户/社交登录

async sociallogin({ commit }) {
        try {
            const provider = new firebase.auth.GoogleAuthProvider();
            await firebase.auth().signInWithPopup(provider).then((result) => {
                const token = result.user.uid;
                const email  = result.user.email;
                // even if i comment the below cookie.set out google still sets a cookie
                Cookie.set('access_token',token);

                commit('SET_USER',{
                    email,token
                })
            });
        } catch(err) {
            throw err
        }
    }

我的 cookiesetter:

import JWTDecode from 'jwt-decode';
import cookieparser from 'cookieparser';

export const actions = {
    nuxtServerInit({commit},{req}) {
        if(process.server && process.static) return;
        // if(!req.headers.cookie) return;
        const parsed = cookieparser.parse(req.headers.cookie);
        const accesstokenCookie = parsed.access_token;

        if(!accesstokenCookie) return;
        const decoded = JWTDecode(accesstokenCookie);
        
        if(decoded) {
            commit('users/SET_USER',{
                uid: decoded.user_id,email: decoded.email
            })
        }
    }
}

这里是我测试状态是否改变的地方:

<template>
    <div>
        <h1>
            Welkom!
        </h1>
    </div>
</template>
<script>

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

export default {

    mounted() {
        console.log(this.$store.state.users.user)
    }
}
</script>

我该如何解决这个问题?下面让我知道。 编辑: 这是我的状态:

export const mutations = {
    SET_USER: (state,account) => {
        state.user = account;
    }
}

我从另一个名为 login 的操作中获取帐户,它使用 signInWithEmailAndPassword(account.email,account.password) 方法

编辑:

解决了我的问题,它有一些大的变化。我在 data: () 的帐户部分中设置了用户的所有信息,其中包含:电子邮件、姓名、姓氏 signinwithpopup 函数现在设置在我页面sociallogin() 函数中(如果有)没有错误,它将 result.user.email 设置为 this.account.email 然后我有调度功能并将帐户详细信息作为第二个参数提供给它,我将 store>users>index sociallogin() 更改为:

async registersocial({ commit },account) {

        console.log(account)
            const token = await auth.currentUser.getIdToken();
            const { email,uid } = auth.currentUser;

            Cookie.set('access_token',token);

            commit('SET_USER',{
                email,uid
            });
            const users = firebase.database().ref('Gebruikers/')
                users.once('value',function(snapshot){
                    const naam = account.naam
                    const achternaam = account.achternaam
                    const email = account.email

                    var sameemail = null

                    snapshot.forEach(function(childSnapshot) {
                        const data = childSnapshot.exportVal()
                        if(data.Email == email) {
                            sameemail = email
                        }
                    })

                    if(sameemail != email) {
                        users.push({
                            Voornaam: naam,Achternaam: achternaam,Email: email
                        })
                    }
                })
    }

它检查电子邮件是否存在于数据库中,如果不存在,则将用户和附加信息推送到数据库,并在上面调用 cookie 设置器,这不会出错并且工作正常。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...