Flux de jeton d'actualisation JWT

129

Je crée une application mobile et j'utilise JWT pour l'authentification.

Il semble que la meilleure façon de procéder consiste à associer le jeton d'accès JWT à un jeton d'actualisation afin que je puisse expirer le jeton d'accès aussi souvent que je le souhaite.

  1. À quoi ressemble un jeton d'actualisation? Est-ce une chaîne aléatoire? Cette chaîne est-elle chiffrée? Est-ce un autre JWT?
  2. Le jeton d'actualisation serait stocké dans la base de données sur le modèle utilisateur pour l'accès, n'est-ce pas? Il semble qu'il devrait être crypté dans ce cas
  3. Vais-je renvoyer le jeton d'actualisation après une connexion utilisateur, puis demander au client d'accéder à un itinéraire distinct pour récupérer un jeton d'accès?
jtmarmon
la source
3
Notez que si vous utilisez des jetons d'actualisation, vous devez permettre aux utilisateurs de les invalider sur l'interface utilisateur. Il est également recommandé de les expirer automatiquement s'ils ne sont pas utilisés par exemple pendant un mois.
Vilmantas Baranauskas
1
@jtmarmon: comment stocker le jeton d'actualisation côté client? Je veux dire l'appareil Android avec sécurité?
j10

Réponses:

39

En supposant qu'il s'agit d'OAuth 2.0 puisqu'il s'agit de JWT et de jetons d'actualisation ...:

  1. tout comme un jeton d'accès, en principe, un jeton d'actualisation peut être n'importe quoi, y compris toutes les options que vous décrivez; un JWT peut être utilisé lorsque le serveur d'autorisation veut être sans état ou veut appliquer une sorte de sémantique de «preuve de possession» au client qui le présente; notez qu'un jeton d'actualisation diffère d'un jeton d'accès en ce qu'il n'est pas présenté à un serveur de ressources mais uniquement au serveur d'autorisation qui l'a émis en premier lieu, de sorte que l'optimisation de validation autonome pour JWTs-as-access-tokens fait ne pas tenir pour les jetons d'actualisation

  2. cela dépend de la sécurité / accès de la base de données; si la base de données est accessible par d'autres parties / serveurs / applications / utilisateurs, alors oui (mais votre kilométrage peut varier en fonction de l'endroit et de la manière dont vous stockez la clé de cryptage ...)

  3. un serveur d'autorisation peut émettre à la fois des jetons d'accès et des jetons d'actualisation en même temps, en fonction de la concession utilisée par le client pour les obtenir; la spécification contient les détails et les options sur chacune des subventions standardisées

Hans Z.
la source
31
2. Vous devez stocker un hachage du jeton d'actualisation dans votre base de données, puis comparer le hachage du jeton d'actualisation de l'utilisateur avec votre hachage stocké. La règle «ne stockez pas les mots de passe en texte brut dans votre base de données» suit ici. Considérez un jeton comme un mot de passe aléatoire que vous avez créé pour l'utilisateur.
Rohmer
2
En outre, si vous souhaitez fournir plus de sécurité, effectuez également une rotation des jetons d'actualisation. L'importance de ceci est déjà mentionnée dans l' ITEF RFC 6749 . S'il est mis en œuvre correctement, cela peut également aider à identifier le scénario de vol de jeton, c'est-à-dire que le jeton d'actualisation a été volé par un attaquant. Si vous cherchez une meilleure explication,
rendez-vous
83

Voici les étapes à suivre pour révoquer votre jeton d'accès JWT:

  1. Lorsque vous vous connectez, envoyez 2 jetons (jeton d'accès, jeton d'actualisation) en réponse au client.
  2. Le jeton d'accès aura moins de temps d'expiration et Refresh aura un long délai d'expiration.
  3. Le client (frontal) stockera le jeton d'actualisation dans son stockage local et le jeton d'accès dans les cookies.
  4. Le client utilisera un jeton d'accès pour appeler les API. Mais lorsqu'il expire, choisissez le jeton d'actualisation dans le stockage local et appelez l'API du serveur d'authentification pour obtenir le nouveau jeton.
  5. Votre serveur d'authentification aura une API exposée qui acceptera le jeton d'actualisation, vérifiera sa validité et renverra un nouveau jeton d'accès.
  6. Une fois le jeton d'actualisation expiré, l'utilisateur sera déconnecté.

S'il vous plaît laissez-moi savoir si vous avez besoin de plus de détails, je peux également partager le code (Java + Spring boot).

Pour vos questions:

Q1: C'est un autre JWT avec moins de réclamations et un long délai d'expiration.

Q2: Ce ne sera pas dans une base de données. Le backend ne sera stocké nulle part. Ils décrypteront simplement le jeton avec une clé privée / publique et le valideront également avec son heure d'expiration.

Q3: oui, correct

Bhupinder Singh
la source
28
Je pense que le JWT devrait être stocké localStorageet le refreshTokendevrait être stocké dans un fichier httpOnly. Le refreshToeknpeut être utilisé pour obtenir un nouveau JWT, il doit donc être manipulé avec plus de précaution.
Tnc Andrei
2
Merci qu'entendez-vous par stockage dans httpOnly? Pourquoi ne pas stocker les deux dans localStorage?
Jay
8
Je manque les avantages de l'utilisation du jeton d'actualisation, ne serait-ce pas la même chose pour prolonger la validité du jeton d'accès?
user2010955
3
@Jay Selon le Microsoft Developer Network, HttpOnly est un indicateur supplémentaire inclus dans un en-tête de réponse HTTP Set-Cookie. L'utilisation de l'indicateur HttpOnly lors de la génération d'un cookie permet d'atténuer le risque que le script côté client accède au cookie protégé (si le navigateur le prend en charge).
shadow0359
23
# 2 est très inexact. Un jeton d'actualisation DOIT être stocké côté serveur. Vous ne devez pas utiliser la propriété "autonome" de JWT pour un jeton d'actualisation. Cela ne vous laisse aucun moyen de révoquer les jetons d'actualisation autres que la modification de votre clé privée.
Jai Sharma
26

Basé sur cette implémentation avec Node.js de JWT avec un jeton d'actualisation :

1) Dans ce cas, ils utilisent un uid et ce n'est pas un JWT. Lorsqu'ils actualisent le jeton, ils envoient le jeton d'actualisation et l'utilisateur. Si vous l'implémentez en tant que JWT, vous n'avez pas besoin d'envoyer l'utilisateur, car il le ferait à l'intérieur du JWT.

2) Ils implémentent ceci dans un document séparé (tableau). Cela a du sens pour moi, car un utilisateur peut être connecté dans différentes applications clientes et il pourrait avoir un jeton d'actualisation par application. Si l'utilisateur perd un appareil avec une application installée, le jeton d'actualisation de cet appareil peut être invalidé sans affecter les autres appareils connectés.

3) Dans cette implémentation, il répond à la méthode de connexion avec à la fois un jeton d'accès et un jeton d'actualisation. Cela me semble correct.

David
la source
En disant "1) Dans ce cas, ils utilisent un uid ..." vouliez-vous dire UUID?
ozanmuyes
Qu'en est- il de cette mise en œuvre plus simple - Numéro JWT - envoyer le plus JWT lorsque vous voulez rafraîchir - (vous pouvez vérifier iatavec fenêtre) - réémettre un nouveau basé sur le précédent
adonese
@adonese en envoyant uniquement le que JWTvous voulez avoir à l' refresh_tokenintérieur? Si tel est le cas, OAuth RFC 6749 dit explicitement de ne pas envoyer refresh_tokenau serveur de ressources (et le JWTest envoyé aux serveurs de ressources): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa