问题描述
如果您通过 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 (将#修改为@)