2

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

这有点难以解释,但是当我从我的网站登录时设置了 cookie,当我转到另一条路线时从谷歌设置了它,我什至打印了用户状态并看到我收到了电子邮件和 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.emailthis.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 设置器,这不会出错并且工作正常。

4

0 回答 0