web-dev-qa-db-fra.com

Mettre à jour/modifier la revendication de rôles (ou toute autre revendication) dans JWT

Je stocke des rôles d'utilisateur dans un JWT (pour limiter les points de terminaison d'API). Les rôles peuvent être modifiés par un administrateur.

Si un rôle est changé. Comment suis-je censé refléter cela dans tous les jetons? J'ai réfléchi à quelques solutions:

  • Si j'utilisais des jetons d'actualisation, l'utilisateur devrait attendre que la date d'expiration du jeton d'accès soit expirée.

  • Je pourrais garder une trace des ID utilisateur modifiés et vérifier chaque demande, puis renvoyer un nouveau jeton si l'utilisateur a été modifié.

Y at-il un moyen standard de le faire?

14
tobbe

Les jetons d'actualisation ne semblent pas être la solution si les modifications apportées sont instantanées, vous ne voulez probablement pas qu'un utilisateur accède aux outils de modération pendant un certain temps si vous révoquez ses autorisations.

Ce que vous pouvez faire est de garder un numéro de version dans le jeton jwt relatif à l'utilisateur, un peu comme le fait mangouste avec son versionKey . Ce faisant, vous pourrez comparer cette version à celle de la base de données pour un utilisateur donné. Chaque fois que vous modifiez les rôles de cet utilisateur, vous incrémentez cette version. Si la version du jwt ne correspond pas, il vous suffit de recréer une nouvelle version avec les rôles et la version corrects et de la renvoyer à l'utilisateur.

Je ne crois pas qu'il existe une norme appropriée pour cela, car jwt est immuable de par sa conception, vous devrez le changer complètement si vous avez besoin de le "mettre à jour".

6
Balthazar

Les jetons JWT étant immuables, vous ne pouvez pas modifier/mettre à jour les revendications d'un jeton existant. Vous devez donc émettre un nouveau jeton JWT.

Cela conduit au plus gros problème avec JWT - la révocation de jetons. Il n'y a pas de bonnes solutions. Ce que tu peux faire c'est

  • Gardez la date d'expiration JWT courte (et utilisez éventuellement des jetons d'actualisation)

  • Utilisez une liste noire pour conserver une liste de jetons révoqués (bien sûr, vous perdez la partie "sans état" de cette façon)

  • change la clé secrète (gardez à l'esprit que cela annule TOUS les jetons valides de tous les utilisateurs)

La meilleure solution dépend du cas concret.

8
Janar

Pour résoudre ce problème, vous pouvez maintenir la durée de vie du jeton courte. Une fois le jeton arrivé à expiration, vous pouvez le renouveler silencieusement en cas d'accord implicite ou utiliser le mécanisme d'actualisation du jeton pour émettre un nouveau jeton à partir du serveur d'autorisation. Une fois que le rôle a changé, il se peut que le jeton ne soit pas reflété instantanément, mais il sera disponible une fois le jeton renouvelé. 

0
Tanver Hasan

@ Janar a déclaré trois solutions pour gérer différents scénarios, mais il existe toujours des inconvénients correspondants.

J'ai aussi une idée pour révoquer votre jeton:

  1. définissez iat sur la charge JWT. (Vous devriez savoir quelle est la iat)
  2. révoquer les jetons d'un utilisateur:
    • trouver l'identifiant de l'utilisateur
    • laisser le serveur d'authentification rejeter les jetons antérieurs à l'heure actuelle (jugés par iat) et appartenant à cet utilisateur (jugés par userId)
0
Dcalsky