ForgeTotal.js 5
nl

Total.js 5

Gebruikers inloggen met de ingebouwde sessie-authenticatie

Total.js 5 · total5@0.0.19 authsessionssecurity Uitgevoerd met Total.js 5

In plaats van een functie accepteert AUTH(options) een optie-object en installeert een volledige cookie-sessie-authenticatie:

  • secret ondertekent de cookie, cookie is zijn naam en expire bepaalt hoe lang een sessie zonder activiteit in het geheugen blijft
  • onread(meta, next, $) laadt de gebruiker wanneer een geldige cookie binnenkomt van een sessie die niet in het geheugen staat (bijvoorbeeld na een herstart); roep next(null, user) aan, of next('not found') om te weigeren. Controleer hier of de sessie nog in je eigen opslag bestaat, anders blijft een gekopieerde cookie werken nadat de gebruiker is uitgelogd
  • onlogout(session) en onremove(sessionid) draaien wanneer een sessie wordt verwijderd: wis hem uit je opslag
  • options.authcookie($, sessionid, userid, expiration) logt de gebruiker in: het schrijft de ondertekende cookie naar het antwoord
  • options.logout($) verwijdert de sessie en de cookie

Bewaar het optie-object in een variabele: het is de handvat waarmee je gebruikers in- en uitlogt. Daarna is $.user gezet en werken de routes met + en - zoals in het AUTH-recept.

definitions/auth.js
var users = {
	'1': { id: '1', name: 'Anna', password: 'secret' }
};

// sessionid -> userid. In a real app this is a database table.
MAIN.sessions = {};

MAIN.auth = {
	secret: 'change-this-secret',
	cookie: 'forge_session',
	expire: '1 day',
	onread: function(meta, next) {
		var user = users[MAIN.sessions[meta.sessionid]];
		user ? next(null, { id: user.id, name: user.name }) : next('session not found');
	},
	onlogout: function(session) {
		delete MAIN.sessions[session.sessionid];
	},
	onremove: function(sessionid) {
		delete MAIN.sessions[sessionid];
	}
};

AUTH(MAIN.auth);
controllers/account.js
exports.install = function() {
	ROUTE('POST /login/', login);
	ROUTE('+POST /logout/', logout);
	ROUTE('+GET /me/', me);
};

function login($) {

	var user = $.body.id && $.body.id === '1' && $.body.password === 'secret' ? { id: '1', name: 'Anna' } : null;

	if (!user) {
		$.invalid(401);
		return;
	}

	var sessionid = UID();
	MAIN.sessions[sessionid] = user.id;
	MAIN.auth.authcookie($, sessionid, user.id, '1 day');
	$.json({ name: user.name });
}

function logout($) {
	MAIN.auth.logout($);
	$.json({ ok: true });
}

function me($) {
	$.json({ name: $.user.name });
}