2

firebaseを介してGoogleログインでログインする場合、Cookieを設定しようとしています。

説明するのは少し難しいですが、ログインすると、自分のサイトからの Cookie が設定され、Google からの Cookie が設定され、別のルートに移動すると設定されます。ユーザーの状態を印刷して、メールと uid を取得したことを確認しました。戻るが、ページを更新するとエラーが発生する:Invalid token specified: Cannot read property 'replace' of undefined

if(!req.headers.cookie) return;だから私はそれをデバッグしようとしましたが、この行がエラーの場合であるという結論に達しました。または、GoogleもCookieを設定しているためだと思います。他のログイン方法でこれを試してもエラーは発生しませんが、それはGoogleが原因です電子メールとパスワードだけでログインすると、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
        }
    }

私のクッキーセッター:

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;
    }
}

signInWithEmailAndPassword(account.email, account.password) メソッドを使用するログインと呼ばれる他のアクションからアカウントを取得します

編集:

問題を修正しました。いくつかの大きな変更があります。ユーザーからのすべての情報をアカウントセクションに設定しますdata: () 。メール、名前、姓が含ま れますアカウントの詳細を 2 番目のパラメーターとして、次のように変更しました。signinwithpopupsociallogin()result.user.emailthis.account.emailstore>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