mirror of
https://github.com/bellingcat/auto-archiver-setup-tool.git
synced 2026-06-12 21:48:37 +03:00
refactor store to use localStorage to persist authentication
This commit is contained in:
@@ -18,6 +18,34 @@ import {
|
|||||||
} from "firebase/firestore";
|
} from "firebase/firestore";
|
||||||
import { firebaseAuth, firebaseFirestore } from "@/firebase.js";
|
import { firebaseAuth, firebaseFirestore } from "@/firebase.js";
|
||||||
|
|
||||||
|
function saveToLocalStorage(state) {
|
||||||
|
localStorage.setItem("user", JSON.stringify(state.user));
|
||||||
|
localStorage.setItem("access_token", state.access_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadFromLocalStorage() {
|
||||||
|
const user = JSON.parse(localStorage.getItem("user"));
|
||||||
|
const access_token = localStorage.getItem("access_token");
|
||||||
|
return { user, access_token };
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearLocalStorage() {
|
||||||
|
localStorage.removeItem("user");
|
||||||
|
localStorage.removeItem("access_token");
|
||||||
|
}
|
||||||
|
async function waitForGapiAuth2() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const checkGapiAuth2 = () => {
|
||||||
|
if (gapi.auth2 && gapi.auth2.getAuthInstance()) {
|
||||||
|
resolve(gapi.auth2.getAuthInstance());
|
||||||
|
} else {
|
||||||
|
setTimeout(checkGapiAuth2, 100);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
checkGapiAuth2();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default createStore({
|
export default createStore({
|
||||||
state: {
|
state: {
|
||||||
user: null,
|
user: null,
|
||||||
@@ -31,6 +59,7 @@ export default createStore({
|
|||||||
mutations: {
|
mutations: {
|
||||||
setUser(state, user) {
|
setUser(state, user) {
|
||||||
state.user = user;
|
state.user = user;
|
||||||
|
saveToLocalStorage(state);
|
||||||
},
|
},
|
||||||
setUserActiveState(state, active) {
|
setUserActiveState(state, active) {
|
||||||
state.user.active = active;
|
state.user.active = active;
|
||||||
@@ -43,6 +72,7 @@ export default createStore({
|
|||||||
},
|
},
|
||||||
setAccessToken(state, access_token) {
|
setAccessToken(state, access_token) {
|
||||||
state.access_token = access_token;
|
state.access_token = access_token;
|
||||||
|
saveToLocalStorage(state);
|
||||||
},
|
},
|
||||||
setErrorMessage(state, errorMessage) {
|
setErrorMessage(state, errorMessage) {
|
||||||
state.errorMessage = errorMessage;
|
state.errorMessage = errorMessage;
|
||||||
@@ -76,17 +106,22 @@ export default createStore({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async signout({ commit }) {
|
async signout({ commit }) {
|
||||||
console.log("sign out");
|
|
||||||
try {
|
try {
|
||||||
await gapi.auth2.getAuthInstance().signOut();
|
const authInstance = await waitForGapiAuth2();
|
||||||
console.log("User is signed out from gapi.");
|
if (authInstance) {
|
||||||
|
await authInstance.signOut();
|
||||||
|
console.log("User is signed out from gapi.");
|
||||||
|
} else {
|
||||||
|
console.warn("gapi.auth2 is not initialized.");
|
||||||
|
}
|
||||||
|
|
||||||
await signOut(firebaseAuth);
|
await signOut(firebaseAuth);
|
||||||
console.log("User is signed out from firebase.");
|
console.log("User is signed out from firebase.");
|
||||||
|
|
||||||
// clean user from store
|
// clean user from store and local storage
|
||||||
commit("setUser", null);
|
commit("setUser", null);
|
||||||
commit("setDocs", []);
|
commit("setDocs", []);
|
||||||
|
clearLocalStorage();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("signOutUser (firebase/auth.js): ", error);
|
console.error("signOutUser (firebase/auth.js): ", error);
|
||||||
}
|
}
|
||||||
@@ -390,4 +425,44 @@ export default createStore({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
getters: {
|
||||||
|
isTokenExpired: async (state) => {
|
||||||
|
if (!state.access_token) return true;
|
||||||
|
try {
|
||||||
|
const response = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${state.access_token}`);
|
||||||
|
const data = await response.json();
|
||||||
|
if (data.expires_in > 0) return false;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error checking token expiration:", error);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
modules: {},
|
||||||
|
plugins: [
|
||||||
|
(store) => {
|
||||||
|
store.subscribe((mutation, state) => {
|
||||||
|
if (mutation.type === "setUser" || mutation.type === "setAccessToken") {
|
||||||
|
saveToLocalStorage(state);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const { user, access_token } = loadFromLocalStorage();
|
||||||
|
if (user && access_token) {
|
||||||
|
store.commit("setUser", user);
|
||||||
|
store.commit("setAccessToken", access_token);
|
||||||
|
store.getters.isTokenExpired.then((expired) => {
|
||||||
|
if (expired) {
|
||||||
|
store.dispatch("signout");
|
||||||
|
} else {
|
||||||
|
store.dispatch("checkActiveUser");
|
||||||
|
store.dispatch("getDocs");
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
console.error("Error checking token expiration:", error);
|
||||||
|
store.dispatch("signout");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user