ForgeTotal.js 5
de

Total.js 5

Benutzer mit der eingebauten Session-Authentifizierung anmelden

Total.js 5 · total5@0.0.19 authsessionssecurity Mit Total.js 5 ausgeführt

Statt einer Funktion akzeptiert AUTH(options) ein Optionsobjekt und installiert eine vollständige Cookie-Session-Authentifizierung:

  • secret signiert das Cookie, cookie ist sein Name und expire bestimmt, wie lange eine Session ohne Aktivität im Speicher bleibt
  • onread(meta, next, $) lädt den Benutzer, wenn ein gültiges Cookie einer Session ankommt, die nicht im Speicher ist (zum Beispiel nach einem Neustart); rufe next(null, user) auf oder next('not found'), um abzulehnen. Prüfe hier, ob die Session in deinem eigenen Speicher noch existiert, sonst funktioniert ein kopiertes Cookie auch nach dem Abmelden weiter
  • onlogout(session) und onremove(sessionid) laufen, wenn eine Session entfernt wird: Lösche sie aus deinem Speicher
  • options.authcookie($, sessionid, userid, expiration) meldet den Benutzer an: Es schreibt das signierte Cookie in die Antwort
  • options.logout($) entfernt die Session und das Cookie

Behalte das Optionsobjekt in einer Variablen: Es ist das Handle, mit dem du Benutzer an- und abmeldest. Danach ist $.user gesetzt, und die Routen mit + und - funktionieren wie im AUTH-Rezept.

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 });
}