Skip to content
Snippets Groups Projects
Commit 79ba6674 authored by Sandro Lutz's avatar Sandro Lutz
Browse files

Merge branch 'auth-es6' into 'master'

Rewrite auth.js using es6

See merge request amiv-website!17
parents db9d0806 fe397e9d
No related branches found
No related tags found
1 merge request!17Rewrite auth.js using es6
...@@ -3,105 +3,113 @@ import { log } from './log'; ...@@ -3,105 +3,113 @@ import { log } from './log';
const m = require('mithril'); const m = require('mithril');
const auth = { const APISession = {
username: '', username: '',
token: '', token: '',
etag: '', etag: '',
error: '',
id: '', id: '',
authenticated: false, authenticated: false,
lastChecked: 0, 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({ return m.request({
method: 'POST', method: 'GET',
url: `${apiUrl}/sessions`, url: `${apiUrl}/sessions/${this.token}`,
data: { username, password },
}).then((result) => { }).then((result) => {
const dt = new Date(); const dt2 = new Date();
log('logged in!'); log('session is still valid!');
this.token = result.token;
this.etag = result._etag;
this.id = result._id;
this.authenticated = true; this.authenticated = true;
this.username = username; this.etag = result._etag;
localStorage.setItem('token', result.token); this.lastChecked = dt2.getTime();
localStorage.setItem('username', username);
localStorage.setItem('id', result._id);
localStorage.setItem('etag', result._etag);
this.lastChecked = dt.getTime();
m.route.set('/');
}).catch((e) => { }).catch((e) => {
this.error = e.message; log('token is not valid');
}); log(e);
},
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 = '';
this.authenticated = false; this.authenticated = false;
this.error = ''; localStorage.removeItem('session');
localStorage.removeItem('token');
localStorage.removeItem('username'); localStorage.removeItem('username');
localStorage.removeItem('id'); localStorage.removeItem('id');
localStorage.removeItem('etag'); localStorage.removeItem('etag');
m.route.set('/login'); m.route.set('/login');
}).catch((e) => {
this.error = e.message;
this.authenticated = false;
m.route.set('/login');
}); });
}, }
checkLogin() { return new Promise(() => { });
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;
import * as auth from '../models/auth'; import { checkLogin, isLoggedIn, logout } from '../models/auth';
const m = require('mithril'); const m = require('mithril');
module.exports = { module.exports = {
oninit: auth.checkLogin, oninit: checkLogin,
view(vnode) { view(vnode) {
if (auth.authenticated === false) { if (isLoggedIn() === false) {
return m('div', [ return m('div', [
m('nav', [ m('nav', [
m('a', { href: '/', oncreate: m.route.link }, 'AMIV'), m('a', { href: '/', oncreate: m.route.link }, 'AMIV'),
...@@ -27,7 +27,7 @@ module.exports = { ...@@ -27,7 +27,7 @@ module.exports = {
m('a', { m('a', {
href: '/', href: '/',
onclick: () => { onclick: () => {
auth.logout(); logout().then(() => { m.route.set('/'); });
return false; return false;
}, },
oncreate: m.route.link, oncreate: m.route.link,
......
import * as auth from '../models/auth'; import { login } from '../models/auth';
const m = require('mithril'); const m = require('mithril');
module.exports = { module.exports = {
username: '', username: '',
password: '', password: '',
error: '',
view() { view() {
return m('div', [ return m('div', [
m( m(
'form', { 'form', {
onsubmit: (e) => { onsubmit: (e) => {
e.preventDefault(); 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('h3', 'Login'), [
m('p', auth.error), m('p', this.error),
m('input.input[type=text][placeholder=Username]', { m('input.input[type=text][placeholder=Username]', {
oninput: m.withAttr('value', (value) => { this.username = value; }), oninput: m.withAttr('value', (value) => { this.username = value; }),
value: this.username, value: this.username,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment