
Cours Laravel 8 – la sécurité – gestion du profil et API
Lorsqu’on installe Jetstream on n’obtient pas seulement une authentification complète avec enregistrement, connexion et déconnexion, vérification de l’email, oubli du mot de passe, comme on l’a vu dans les deux articles précédents. On obtient beaucoup plus comme on va le voir dans cet article. Déjà une gestion du profil de l’utilisateur qui peut ainsi modifier ses données personnelles, mais également la possibilité de passer par une authentification à deux facteurs qui devient de plus en plus à la mode. l’utilisateur peut en plus supprimer sa session ou carrément son compte. On verra également la possibilité de demander la confirmation du mot de passe pour l’accès à des pages sensibles. Pour terminer j’évoquerai aussi les API.
Le dashboard
On a vu que lorsqu’un utilisateur est connecté il arrive dans le dashbord (pour mémoire on verra plus tard dans ce cours l’aspect localisation pour changer toutes ces appellation dans notre langue préférée). Par défaut sur la page on trouve des renseignements et des liens de Laravel et dans la partie supérieure cet aspect :
On a un menu déroulant à droite en cliquant sur l’image (par défaut on a les deux premiers caractères du nom mais on va pouvoir mettre une vraie image) :
Là on peut procéder à 3 actions :
- accéder au profil
- accéder aux tokens des API
- se déconnecter
Le profil
Quand on accède au profil c’est assez fourni.
Les informations personnelles
Là on peut modifier la photo, le nom et l’email.
La photo
Pour la gestion de la photo Jetstream ajoute à son installation le trait Laravel\Jetstream\HasProfilePhoto dans le modèle User :
use Laravel\Jetstream\HasProfilePhoto; ... class User extends Authenticatable { ... use HasProfilePhoto;
Si on regarde ce trait on y trouve une intendance complète pour gérer la photo. Comme il s’agit d’un trait on peut surcharger les méthodes dans le modèle pour modifier ou ajouter des fonctionnalités.
Quand on charge une photo elle est placée provisoirement ici :
A la sauvegarde elle est placée là :
J’ai déjà parlé dans cet article de la gestion des fichiers de Laravel. Jetstream utilise le disque public pour la gestion des photos (sauf si on utilise Vapor, dans ce cas on va sur S3). Si on crée un lien symbolique tel que c’est préconisé dans la documentation on va dans le dossier storage.
Si on ne veut pas gérer de photo dans le profil il suffit de désactiver l’option dans config/jetstream.php :
'features' => [ //Features::profilePhotos(), ... ],
Le mot de passe
On peut aussi modifier le mot de passe à partir du profil :
L’authentification à deux facteurs
Une autre possibilité intéressante est d’activer l’authentification à deux facteurs (A2F). Pour mémoire avec ce type d’authentification on ne se contente plus du login et du mot de passe mais il faut également une information de sécurité transmise par un autre moyen (application, email, sms…). Ce type de sécurité devient de plus en plus répandue et on parle même maintenant de triple facteur ! Voyons comment Jetstream met cela en place…
Dans le profil on peut activer cette sécurité :
Toujours par sécurité le mot de passe est réclamé :
On obtient cet affichage :
On obtient un QR code pour Google Authenticator (ou autre). On a aussi des codes de récupération à enregistrer en cas de perte de la double authentification.
Abandon de session
Dans le profil on a aussi la possibilité de purger la session :
Suppression de compte
Enfin on peut dans le profil supprimer son compte :
Les API
Jetstream est équipé pour l’utilisation de Laravel Sanctum, qui est un package pour Laravel qui permet de mettre en place simplement des API à partir de l’utilisation de tokens. Un utilisateur peut générer des tokens qui permettent un accès à une API avec des permissions bien définies. Sanctum est installé en même temps que Jetstream et est donc directement disponible.
Jetstream propose une interface simple pour la génération des tokens et de leurs permissions :
Quand on crée un token une fenêtre s’ouvre et il faut copier le token qui n’apparaitra que là :
On a la liste des tokens disponibles :
On peut supprimer un token ou changer ses permissions :
Il y a un trait installé par Jetstream dans le modèle User pour le fonctionnement de ces tokens :
use Laravel\Sanctum\HasApiTokens; ... class User extends Authenticatable { use HasApiTokens;
Dans le code on peut vérifier ce token :
$request->user()->tokenCan('update');
Si on ne veut pas utiliser ces tokens alors il suffit de désactiver l’option dans config/jetstream.php :
'features' => [ .. //Features::api(), ],
Conclusion
On a vu dans cet article que Jetstream permet une gestion du profil de l’utilisateur :
- informations personnelles
- photo
- mot de passe
- authentification à deux facteurs
- abandon de session
- suppression de compte
D’autre part par l’intermédiaire de Sanctum on peut gérer des tokens d’API et leurs permissions.


Un commentaire
fabBlab
Bonjour,
À priori depuis l’écriture de cet article, Jetstream a changé de politique, car la photo du compte et la génération de token d’APi sont commentés par défaut. Assez logique pour le second, car ce n’est pas un besoin très courant.
Par contre, en les décommentant, j’ai rencontré une erreur avec les photos.
Je pouvais les téléverser, mais Laravel ne pouvait enregistrer le nom du fichier, le champ étant manquant :
Illuminate\Database\QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘profile_photo_path’ in ‘field list’ (SQL: update `users` set `profile_photo_path` = profile-photos/KUECWAB3u2kNiTR4mX3DiduL1yiEL3q38DEkZi1X.jpg, `users`.`updated_at` = 2021-06-16 14:12:50 where `id` = 2)
Pourtant j’avais bien lancé les migrations.
En cherchant j’ai vu que les nouveaux champs étaient directement ajoutés dans le script de migration créant la table users :
public function up()
{
Schema::create(‘users’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->string(’email’)->unique();
$table->timestamp(’email_verified_at’)->nullable();
$table->string(‘password’);
$table->rememberToken();
$table->foreignId(‘current_team_id’)->nullable();
$table->string(‘profile_photo_path’, 2048)->nullable();
$table->timestamps();
});
}
Donc si on a déjà lancé la migration créant la table users, comme indiqué dans un des articles précédents, on se retrouve coincés ! Étonnant que JetStream ne fournit pas une migration modifiant la table plutôt que de modifier le script créant la table !
Dans l’article expliquant comment installer JetStream, il faudrait dire de lancer :
php artisan migrate:refresh
Plutôt qu’un simple « migrate ».
Par ailleurs, sur mon serveur de développement pour pouvoir afficher la photo téléchargée sur la page du compte, j’ai été obligé de créer le lien symbolique à la main, comme indiqué dans la doc : https://jetstream.laravel.com/1.x/features/profile-management.html
Et quand on lance le serveur avec : php artisan serve
Il faut penser à changer dans le fichier.env :
APP_URL=http://127.0.0.1:8000
Car sinon la photo est cherchée sur localhost !