Formateur: Fabio Ginja
Lors du register, on va enregister l'utilisateur avec au minimum les champs suivant:
{
email: "example@email.com",
password: "hashedpasseword",
passwordVersion: 0
}
Lors du login, on va générer deux tokens (JWT).
Le premier aura une durée de vie courte (quelques minutes) que l'on appellera accessToken. A chaque fois que l'on fera une requête à notre serveur, l'accessToken permettra au serveur de valider que l'utilisateur est identifié et a le droit d'effectuer cette requête.
Payload data
{
"email": "example@email.com",
}
Un refreshToken, d'une durée plus longue (heures/jours/semaines) qui, tant qu'il sera valide, sera en charge de renvoyer un nouvel accessToken sous certaines conditions.
Payload data
{
"email": "example@email.com",
"passwordVersion": 0
}
passwordVersion est égale à la valeur du champs qui est en base de données.
Considérons que l'utilisateur demande à aller sur sa page profil, page nécessitant qu'il soit bien connecté.
Deux cas de figures:
Le serveur va vérifier si notre refreshToken n'a pas expiré. S'il a expiré, l'utilisateur doit se login à nouveau.
Sinon, la valeur passwordVersion contenu dans notre refreshToken va être comparée à la valeur stockée en base de données.
Deux cas de figures:
Si l'utilisateur met à jour son mot de passe en base de données, on incrémentera passwordVersion en base de données.
Si le refreshToken n'est pas régénéré, on aura deux valeurs différentes de passwordVersion, une dans le refreshToken (restée à 0) et une dans la base de données (passée à 1). Une fois l'accessToken expiré, l'utilisateur devra donc nécessairement s'identifier à nouveau via le login.
{
email: "example@email.com",
password: "updatedHashedpasseword",
passwordVersion: 1
}
(Our) Laptop
Login
accessToken (5 minutes)
refreshToken (2 days)
{
"email": "fabio@email.com"
}
{
"email": "fabio@email.com",
"passwordVersion": 0
}
Hacker Mobile
Login
accessToken (5 minutes)
refreshToken (2 days)
{
"email": "fabio@email.com"
}
{
"email": "fabio@email.com",
"passwordVersion": 0
}
(Our) Laptop
Update password in database
database
{
"email": "fabio@email.com",
"passwordVersion": 1
}
Hacker Mobile
Request Before accessToken expires
accessToken (5 minutes) - Request Ok
{
"email": "fabio@email.com"
}
Hacker Mobile
Request After accessToken expires
refreshToken
database
{
"email": "fabio@email.com",
"passwordVersion": 0
}
{
"email": "fabio@email.com",
"passwordVersion": 1
}
Hacker Logged out 🎉
0 !== 1