💾 login state preserve (localstorage) + ℹ JWT payload parsing

ref #8
This commit is contained in:
Philipp Dormann 2020-12-30 19:55:57 +01:00
parent 51c18e03a7
commit 13ccb56354
4 changed files with 38 additions and 7 deletions

View File

@ -6,9 +6,10 @@
"build": "snowpack build" "build": "snowpack build"
}, },
"dependencies": { "dependencies": {
"@odit/lfk-client-js": "^0.0.5", "@odit/lfk-client-js": "0.0.6",
"filepond": "^4.25.1", "filepond": "^4.25.1",
"gridjs": "^3.2.0", "gridjs": "^3.2.0",
"localforage": "^1.9.0",
"svelte-filepond": "^0.0.1", "svelte-filepond": "^0.0.1",
"svelte-i18n": "^3.3.0", "svelte-i18n": "^3.3.0",
"svelte-spa-router": "^3.1.0", "svelte-spa-router": "^3.1.0",

View File

@ -3,6 +3,7 @@
import Router from "svelte-spa-router"; import Router from "svelte-spa-router";
import { replace } from "svelte-spa-router"; import { replace } from "svelte-spa-router";
import { wrap } from "svelte-spa-router/wrap"; import { wrap } from "svelte-spa-router/wrap";
import localForage from "localforage";
import { addMessages, init, getLocaleFromNavigator } from "svelte-i18n"; import { addMessages, init, getLocaleFromNavigator } from "svelte-i18n";
import en from "./locales/en.json"; import en from "./locales/en.json";
import de from "./locales/de.json"; import de from "./locales/de.json";
@ -12,6 +13,12 @@
fallbackLocale: "en", fallbackLocale: "en",
initialLocale: getLocaleFromNavigator(), initialLocale: getLocaleFromNavigator(),
}); });
localForage.config({
name: "lfk_admin",
version: 1.0,
storeName: "lfk_admin",
description: "LfK! admin dashbaord",
});
// //
import Login from "./components/Login.svelte"; import Login from "./components/Login.svelte";
import Dashboard from "./components/Dashboard.svelte"; import Dashboard from "./components/Dashboard.svelte";

View File

@ -1,5 +1,6 @@
<script> <script>
import store from "../store.js"; import store from "../store.js";
import localForage from "localforage";
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
store.init(); store.init();
import { push, pop, replace } from "svelte-spa-router"; import { push, pop, replace } from "svelte-spa-router";
@ -7,14 +8,32 @@
OpenAPI.BASE = config.baseurl; OpenAPI.BASE = config.baseurl;
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import "toastify-js/src/toastify.css"; import "toastify-js/src/toastify.css";
import { init } from "svelte/internal"; // ------
let usersUsername; let usersUsername;
let usersPassword = ""; let usersPassword = "";
let is_blocked_by_autologin = false;
let last_loginclick_processed = true; let last_loginclick_processed = true;
localForage.getItem("logindata", (err, value) => {
if (value) {
if (value.access_token && value.refresh_token) {
is_blocked_by_autologin = true;
OpenAPI.TOKEN = value.access_token;
const jwtinfo = JSON.parse(atob(OpenAPI.TOKEN.split(".")[1]));
store.login(value.access_token, jwtinfo);
replace("/dashboard/");
Toastify({
text: $_("welcome_wavinghand"),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
}
}
});
const login = async () => { const login = async () => {
// prevent login button spamming // prevent login button spamming
if (last_loginclick_processed) { if (last_loginclick_processed && is_blocked_by_autologin === false) {
last_loginclick_processed = false; last_loginclick_processed = false;
Toastify({ Toastify({
text: $_("login_is_checked"), text: $_("login_is_checked"),
@ -32,9 +51,11 @@
username, username,
password, password,
}) })
.then((result) => { .then(async (result) => {
await localForage.setItem("logindata", result);
OpenAPI.TOKEN = result.access_token; OpenAPI.TOKEN = result.access_token;
store.login(result.access_token); const jwtinfo = JSON.parse(atob(OpenAPI.TOKEN.split(".")[1]));
store.login(result.access_token, jwtinfo);
replace("/dashboard/"); replace("/dashboard/");
Toastify({ Toastify({
text: $_("welcome_wavinghand"), text: $_("welcome_wavinghand"),

View File

@ -3,6 +3,7 @@ import { writable } from 'svelte/store';
const store = () => { const store = () => {
const state = { const state = {
access_token: undefined, access_token: undefined,
jwtinfo: undefined,
isLoggedIn: false isLoggedIn: false
}; };
@ -16,10 +17,10 @@ const store = () => {
return state; return state;
}); });
}, },
login(access_token, jwtinfo) {
login(access_token) {
update((state) => { update((state) => {
state.access_token = access_token; state.access_token = access_token;
state.jwtinfo = jwtinfo;
state.isLoggedIn = true; state.isLoggedIn = true;
console.log('login performed'); console.log('login performed');
return state; return state;
@ -37,6 +38,7 @@ const store = () => {
subscribe, subscribe,
set, set,
update, update,
state,
...methods ...methods
}; };
}; };