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

> Passez un objet d'options à AUTH() pour obtenir des cookies de session signés, un magasin de sessions et la déconnexion sans écrire la plomberie.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: 6fb48fa5916f80116ae1f653061b23d19fa9f37acb9a35b35b41fe51eb93731b
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

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.

```js 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);
```

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