如果您通过 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.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 设置器,这不会出错并且工作正常。