ForgeTotal.js 5
fr

Total.js 5

Connecter des utilisateurs avec l'authentification par session intégrée

Total.js 5 · total5@0.0.19 authsessionssecurity Exécutée avec Total.js 5

Au lieu d'une fonction, AUTH(options) accepte un objet d'options et installe une authentification complète par cookie de session :

  • secret signe le cookie, cookie est son nom et expire la durée pendant laquelle une session reste en mémoire sans activité
  • onread(meta, next, $) charge l'utilisateur quand un cookie valide arrive d'une session qui n'est pas en mémoire (par exemple après un redémarrage) ; appelez next(null, user), ou next('not found') pour refuser. Vérifiez ici que la session existe encore dans votre propre magasin, sinon un cookie copié continue de fonctionner après la déconnexion de l'utilisateur
  • onlogout(session) et onremove(sessionid) s'exécutent quand une session est supprimée : supprimez-la de votre magasin
  • options.authcookie($, sessionid, userid, expiration) connecte l'utilisateur : il écrit le cookie signé dans la réponse
  • options.logout($) supprime la session et le cookie

Gardez l'objet d'options dans une variable : c'est la poignée qui sert à connecter et déconnecter les utilisateurs. Ensuite, $.user est défini et les routes + et - fonctionnent comme dans la recette AUTH.

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