web-dev-qa-db-fra.com

Connexion et déconnexion du jeton JWT

Salut, je crée une application native mobile qui utilise REST points de terminaison API pour communiquer avec le côté serveur. J'ai eu une expérience précédente dans le développement de clients natifs, mais j'ai un jeton simple (chaîne générée de façon aléatoire) stocké dans la base de données dans la même table où les informations utilisateur sont stockées. C'est donc comme les sessions utilisées dans le navigateur, mais au lieu des cookies, chaque demande a un jeton dans l'en-tête.

Récemment, j'ai découvert le jeton JWT. Cela semble être un excellent moyen de sécuriser des points de terminaison qui sont privés. Vous pouvez demander un jeton à un client mobile à condition de passer + vous connecter et d'obtenir un jeton généré en réponse. Mais la seule chose importante est que ce jeton n'est stocké nulle part sur le serveur, le serveur vérifie le jeton à l'aide de Word secret, qui est privé pour le serveur comme une clé privée. C'est correct pour les points de terminaison sécurisés, mais que faire si j'ai besoin d'une session utilisateur, par exemple comment fonctionnent des applications comme Facebook, Amazon, Aliexpress ..., elles ont la possibilité d'utiliser l'application sans fournir d'informations d'identification, en naviguant simplement dans le magasin, mais nécessite une connexion lorsque l'utilisateur ne souhaite pas effectuer d'achat. Et après cette session utilisateur est conservée pendant un certain temps. Cela peut être mis en œuvre avec le jeton JWT sans aucun problème, mais lorsque l'utilisateur doit se déconnecter, que faire dans ce cas? Le jeton n'est stocké nulle part sur le serveur, alors comment puis-je détruire ce jeton pour le rendre invalide?

Si le jeton est stocké dans la base de données, l'API n'est pas sans état, comme REST devrait l'être. Donc, en général, il n'y a aucun moyen de garder l'utilisateur connecté dans l'API sans état, ai-je raison?

J'ai quelques idées sur la façon de l'implémenter à l'aide du jeton JWT, mais encore une fois, ce ne sera pas une API sans état, si je comprends bien.

  1. Créer la liste des jetons expirés
  2. Stockez le jeton JWT dans la base de données, mais quel est le but du jeton auto-descriptif (JWT) dans ce cas s'il est stocké dans la base de données, l'idée principale du jeton JWT pour conserver toutes les informations avec un jeton, comme je le sais.

Veuillez suggérer quelle est la meilleure façon de procéder dans ce cas et corrigez-moi si je me trompe. Merci.

12
eemrxoha

Les jetons JWT sont principalement conçus comme un mécanisme d'assertion, c'est-à-dire fournissent les informations utilisateur pertinentes pour permettre au serveur de "connaître" l'utilisateur au nom duquel l'opération est effectuée. JWT est parfait pour le scénario suivant

  1. Vous ne pouvez pas accéder aux informations utilisateur côté serveur sans implication de l'utilisateur, mais vous avez besoin d'informations de base pour les appels hors ligne.
  2. Provisioning JIT, c'est-à-dire pour transférer les détails de l'utilisateur d'un site à un autre (aka fédération).
  3. Fonctionnement sans session/sans état avec des données limitées, c'est-à-dire que vous avez besoin de données utilisateur spécifiques à chaque transaction mais n'avez pas de concept de session (par exemple, API, système de traitement des événements)

Même s'il semble être utilisé pour la session, je pense que ce n'est pas le meilleur utilisé pour la même chose.

OAuth est plus approprié, je pense, pour la gestion des sessions. Il est conçu avec des concepts de base comme le jeton de rafraîchissement (extension de session en cas d'expiration de session), le jeton d'accès (identifiant de session) qui correspond facilement aux concepts de gestion de session. Dans le cas d'OAuth, la méthode d'authentification (comme JWT) appartient au serveur de décider. Après cela, la seule chose dont le client a besoin pour la durée de la session est un jeton d'accès (similaire à l'ID de session). Le plus gros problème que j'ai vu se poser est que les jetons d'accès et les jetons d'actualisation doivent être stockés et gérés sur le serveur. Si vous pouvez facilement mapper le jeton d'accès à l'ID de session, je pense que vous pouvez supprimer ce besoin. Mais étant donné que vous travaillez déjà sur le stockage de JWT, cela ne devrait pas vous poser de problème.

2
jhash

Vous regardez une limitation classique des JWT. Ils ne sont pas conçus pour la gestion de session. Cependant, vous pouvez les utiliser avec certaines limitations (pas de déconnexion, sauf si vous utilisez la liste noire, pas de délai d'inactivité, etc ...)

En fin de compte, vous devez décider de ce qui est acceptable pour votre cas d'utilisation. Voyons les détails.

comment fonctionnent des applications comme Facebook, Amazon, Aliexpress ...,

La nature exacte de leur gestion de session m'est inconnue. Je pense qu'ils utilisent la gestion de session avec état ou une combinaison des deux pour atteindre leur objectif.

mais lorsque l'utilisateur doit se déconnecter, que faire dans ce cas?

Si vous utilisez JWT, vous avez besoin d'un moyen de mettre sur liste noire les jetons, ce qui nécessite un stockage d'état. Cela peut être côté serveur comme vous l'avez décrit ou vous pouvez configurer un service dédié uniquement pour maintenir cet état (cela laissera votre API sans état, mais introduira de la complexité).

alors comment puis-je détruire ce jeton pour le rendre invalide?

Vous ne pouvez pas détruire un JWT. Il est possible de l'invalider en modifiant la clé de signature, mais cela rendra [~ # ~] tous les jetons [~ # ~] invalides, que vous la même clé.

Donc, en général, il n'y a aucun moyen de garder l'utilisateur connecté dans l'API sans état, ai-je raison?

Être "connecté" est un état que vous devez stocker quelque part. Si vous l'externalisez vers un service, il est possible que l'API reste apatride et prenne en charge la connexion et la déconnexion.

J'ai quelques idées sur la façon de l'implémenter à l'aide du jeton JWT, mais encore une fois, ce ne sera pas une API sans état, si je comprends bien.

  1. Créer la liste des jetons expirés

C'est ce qu'on appelle la liste noire JWT et cela sert le but que vous avez décrit.

  1. Stockez le jeton JWT dans la base de données, mais quel est le but du jeton auto-descriptif (JWT) dans ce cas s'il est stocké dans la base de données, l'idée principale du jeton JWT pour conserver toutes les informations avec un jeton, comme je le sais.

Vous avez raison, cela rend la capacité d'auto-description presque inutile.

Pour résumer le tout, vous devez décider si vous avez besoin des avantages de JWT. Si oui, pouvez-vous vivre avec ses inconvénients? À mon avis, vous devriez préférer les sessions avec état dans la plupart des cas.

Dans le cas où vous êtes intéressé par des alternatives d'authentification, consultez le guide d'authentification web api J'ai mis en place.

0
Daniel Szpisjak