Meine App verwendet die Firebase-API für die Benutzerauthentifizierung. Der Anmeldestatus wird als boolescher Wert in einem Vuex-Status gespeichert.
Wenn sich der Benutzer anmeldet, stelle ich den login-Status ein und zeige die Schaltfläche Login/Logout entsprechend an.
Wenn die Seite jedoch aktualisiert wird, geht der Status der Vue-App verloren und wird auf den Standard zurückgesetzt
Dies führt zu einem Problem, da selbst wenn der Benutzer angemeldet ist und die Seite aktualisiert wird, der login-Status wieder auf false gesetzt wird und die Login-Schaltfläche anstelle der Abmelden-Schaltfläche angezeigt wird, obwohl der Benutzer angemeldet bleibt ....
Was soll ich tun, um dieses Verhalten zu verhindern
Soll ich cookies Oder eine andere bessere Lösung verwenden?.
Dies ist ein bekannter Anwendungsfall. Es gibt verschiedene Lösungen.
Zum Beispiel kann man vuex-persistedstate
verwenden. Dies ist ein Plugin für vuex
, um den Status zwischen Seitenaktualisierungen zu behandeln und zu speichern.
Beispielcode:
import { Store } from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'
const store = new Store({
// ...
plugins: [
createPersistedState({
getState: (key) => Cookies.getJSON(key),
setState: (key, state) => Cookies.set(key, state, { expires: 3, secure: true })
})
]
})
Was wir hier machen, ist einfach:
js-cookie
installieren.getState
versuchen wir, den gespeicherten Status von Cookies
zu ladensetState
speichern wir unseren Zustand in Cookies
Dokumente und Installationsanweisungen: https://www.npmjs.com/package/vuex-persistedstate
Ich denke, die Verwendung von Cookies/localStorage zum Speichern des Anmeldestatus kann in einigen Situationen zu Fehlern führen.
Firebase zeichnet bereits Anmeldeinformationen bei localStorage auf, darunter expirationTime und refreshToken.
Deshalb werde ich den von Vue erstellten Hook und das Firebase-API verwenden, um den Login-Status zu überprüfen.
Wenn das Token abgelaufen ist, wird das API für uns aktualisiert.
Wir können also sicherstellen, dass der Login-Status in unserer App Firebase entspricht.
new Vue({
el: '#app',
created() {
firebase.auth().onAuthStateChanged((user) => {
if (user) {
log('User is logined');
// update data or vuex state
} else {
log('User is not logged in.');
}
});
},
});
Ich habe dieses Problem gelöst, indem ich meine Kopfzeilen jedes Mal zurücksetzte, wenn ich die Daten erneut abrenne.
new Vue({
el: 'vue',
render: h => h(VueBox),
router,
store,
computed: {
tokenJWT () {
return this.$store.getters.tokenCheck
},
},
created() {
this.setAuth()
},
methods:
Object.assign({}, mapActions(['setUser']), {
setAuth(){
if (this.tokenJWT) {
if (this.tokenJWT === 'expired') {
this.$store.dispatch('destroyAuth')
this.$store.dispatch('openModal')
this.$store.dispatch('setElModal', 'form-login')
} else {
window.axios.defaults.headers.common = {
'Accept': 'application/json',
'Authorization': 'Bearer ' + this.tokenJWT
}
axios.get( api.domain + api.authApi )
.then(res => {
if (res.status == 200) {
this.setUser( res.data.user )
}
})
.catch( errors => {
console.log(errors)
this.destroyAuth()
})
}
}
}
})
})
auf Zustand setzen:
producer: JSON.parse(localStorage.getItem('producer') || "{}")
mutationen anlegen:
localStorage.setItem("producer",JSON.stringify(state.producer)) // OR
localStorage.removeItem("producers");
funktioniert gut für mich!