From fe397e9d2ece0a8a5d9a1e4369a176ebfe1d9637 Mon Sep 17 00:00:00 2001 From: Moritz Schneider <scmoritz@student.ethz.ch> Date: Sat, 2 Dec 2017 11:13:44 +0100 Subject: [PATCH] Rewrite auth.js using es6 --- src/models/auth.js | 180 +++++++++++++++++++++++--------------------- src/views/layout.js | 8 +- src/views/login.js | 9 ++- 3 files changed, 104 insertions(+), 93 deletions(-) diff --git a/src/models/auth.js b/src/models/auth.js index 899cd181..bc45c1cb 100644 --- a/src/models/auth.js +++ b/src/models/auth.js @@ -3,105 +3,113 @@ import { log } from './log'; const m = require('mithril'); -const auth = { +const APISession = { username: '', token: '', etag: '', - error: '', id: '', authenticated: false, lastChecked: 0, - login(username, password) { - this.reloadLocalStorage(); +}; + +export function getUsername() { + return APISession.username; +} + +export function getToken() { + return APISession.token; +} + +export function isLoggedIn() { + return APISession.authenticated; +} + +function reloadLocalStorage() { + log('checking stored session'); + if (localStorage.getItem('token') !== null) { + APISession.token = localStorage.token; + APISession.id = localStorage.id; + APISession.username = localStorage.username; + APISession.etag = localStorage.etag; + APISession.authenticated = true; + } +} + +export function login(username, password) { + reloadLocalStorage(); + return m.request({ + method: 'POST', + url: `${apiUrl}/sessions`, + data: { username, password }, + }).then((result) => { + const dt = new Date(); + log('logged in!'); + APISession.token = result.token; + APISession.etag = result._etag; + APISession.id = result._id; + APISession.authenticated = true; + APISession.username = username; + localStorage.setItem('token', result.token); + localStorage.setItem('username', username); + localStorage.setItem('id', result._id); + localStorage.setItem('etag', result._etag); + APISession.lastChecked = dt.getTime(); + }); +} + +export function logout() { + reloadLocalStorage(); + APISession.authenticated = false; + return m.request({ + method: 'DELETE', + url: `${apiUrl}/sessions/${APISession.id}`, + headers: { + Authorization: `Token ${APISession.token}`, + 'If-Match': APISession.etag, + }, + }).then(() => { + log('logged out!'); + APISession.token = ''; + APISession.authenticated = false; + localStorage.removeItem('token'); + localStorage.removeItem('username'); + localStorage.removeItem('id'); + localStorage.removeItem('etag'); + // m.route.set('/login'); + }).catch(() => { + APISession.authenticated = false; + // m.route.set('/login'); + }); +} + +export function checkLogin() { + const dt = new Date(); + reloadLocalStorage(); + if (this.authenticated === true) { + log('no session found'); + m.route.set('/login'); + return new Promise(() => { }); + } + if (dt.getTime() > this.lastChecked + 5000) { return m.request({ - method: 'POST', - url: `${apiUrl}/sessions`, - data: { username, password }, + method: 'GET', + url: `${apiUrl}/sessions/${this.token}`, }).then((result) => { - const dt = new Date(); - log('logged in!'); - this.token = result.token; - this.etag = result._etag; - this.id = result._id; + const dt2 = new Date(); + log('session is still valid!'); this.authenticated = true; - this.username = username; - localStorage.setItem('token', result.token); - localStorage.setItem('username', username); - localStorage.setItem('id', result._id); - localStorage.setItem('etag', result._etag); - this.lastChecked = dt.getTime(); - m.route.set('/'); + this.etag = result._etag; + this.lastChecked = dt2.getTime(); }).catch((e) => { - this.error = e.message; - }); - }, - logout() { - this.reloadLocalStorage(); - this.authenticated = false; - return m.request({ - method: 'DELETE', - url: `${apiUrl}/sessions/${this.id}`, - headers: { - Authorization: `Token ${this.token}`, - 'If-Match': this.etag, - }, - }).then(() => { - log('logged out!'); - this.token = ''; + log('token is not valid'); + log(e); this.authenticated = false; - this.error = ''; - localStorage.removeItem('token'); + localStorage.removeItem('session'); localStorage.removeItem('username'); localStorage.removeItem('id'); localStorage.removeItem('etag'); m.route.set('/login'); - }).catch((e) => { - this.error = e.message; - this.authenticated = false; - m.route.set('/login'); }); - }, - checkLogin() { - const dt = new Date(); - auth.reloadLocalStorage(); - if (this.authenticated === true) { - log('no session found'); - m.route.set('/login'); - return new Promise(() => { }); - } - if (dt.getTime() > this.lastChecked + 5000) { - return m.request({ - method: 'GET', - url: `${apiUrl}/sessions/${this.token}`, - }).then((result) => { - const dt2 = new Date(); - log('session is still valid!'); - this.authenticated = true; - this.etag = result._etag; - this.lastChecked = dt2.getTime(); - }).catch((e) => { - log('token is not valid'); - log(e); - this.authenticated = false; - localStorage.removeItem('session'); - localStorage.removeItem('username'); - localStorage.removeItem('id'); - localStorage.removeItem('etag'); - m.route.set('/login'); - }); - } - return new Promise(() => { }); - }, - reloadLocalStorage() { - log('checking stored session'); - if (localStorage.getItem('token') !== null) { - this.token = localStorage.token; - this.id = localStorage.id; - this.username = localStorage.username; - this.etag = localStorage.etag; - this.authenticated = true; - } - }, -}; - -module.exports = auth; + } + return new Promise(() => { }); +} diff --git a/src/views/layout.js b/src/views/layout.js index db6314b6..4e6a7e66 100644 --- a/src/views/layout.js +++ b/src/views/layout.js @@ -1,11 +1,11 @@ -import * as auth from '../models/auth'; +import { checkLogin, isLoggedIn, logout } from '../models/auth'; const m = require('mithril'); module.exports = { - oninit: auth.checkLogin, + oninit: checkLogin, view(vnode) { - if (auth.authenticated === false) { + if (isLoggedIn() === false) { return m('div', [ m('nav', [ m('a', { href: '/', oncreate: m.route.link }, 'AMIV'), @@ -27,7 +27,7 @@ module.exports = { m('a', { href: '/', onclick: () => { - auth.logout(); + logout().then(() => { m.route.set('/'); }); return false; }, oncreate: m.route.link, diff --git a/src/views/login.js b/src/views/login.js index eabc01a9..02d154f0 100644 --- a/src/views/login.js +++ b/src/views/login.js @@ -1,21 +1,24 @@ -import * as auth from '../models/auth'; +import { login } from '../models/auth'; const m = require('mithril'); module.exports = { username: '', password: '', + error: '', view() { return m('div', [ m( 'form', { onsubmit: (e) => { e.preventDefault(); - auth.login(this.username, this.password); + login(this.username, this.password) + .then(() => { m.route.set('/'); }) + .catch((err) => { this.error = err; }); }, }, m('h3', 'Login'), [ - m('p', auth.error), + m('p', this.error), m('input.input[type=text][placeholder=Username]', { oninput: m.withAttr('value', (value) => { this.username = value; }), value: this.username, -- GitLab