Modèles d'entreprise pour l'authentification JWT pour les applications basées sur REST?

9

La spécification JWT décrit uniquement la charge utile et la façon dont elle est envoyée, mais laisse le protocole d'authentification ouvert, ce qui permet la flexibilité, mais malheureusement, la flexibilité peut conduire à des antipatterns et à une mauvaise conception.

Je recherche un modèle d'entreprise bien pensé et testé pour l'authentification JWT, que je pourrais utiliser ou adapter, mais je n'ai pas réussi à trouver quelque chose de complet.

Ce à quoi je pensais c'est:

  • lorsqu'aucun en-tête d'autorisation n'est satisfait, ou si le jeton JWT n'est pas valide ou a expiré, envoyez HTTP 401
  • pour vous authentifier, utilisez / connectez-vous au canal REST, envoyez le nom d'utilisateur et le mot de passe comme objet JSON
  • afin de garder le jeton en vie, utilisez le canal REST / keepalive, appelez-le toutes les N (5) minutes, recevez un nouveau jeton JWT et remplacez celui existant après chaque appel (le jeton expire après M (15) minutes)

Cependant, ce qui me dérange, c'est la nécessité de ce canal / keepalive. D'un autre côté, cela m'oblige à empêcher l'expiration de l'authentification, même si l'utilisateur est absent (la décision, si nous voulons que keepalive ne soit pas encore satisfaite) et bien sûr, ce sont des appels supplémentaires et une complication supplémentaire au protocole. Ce qui serait intéressant, c'est que le serveur prolonge automatiquement le jeton. Dans un environnement basé sur une session, cela se produit en réinitialisant l'horodatage, ici, cependant, le serveur devrait envoyer un nouveau jeton, peut-être pas à chaque fois, mais une fois que le jeton va expirer dans R (disons, 10) minutes. Mais le placer dans le corps de la réponse signifierait modifier le protocole de réponse JSON (par conséquent, la solution est invasive et non transparente), et mettre un en-tête HTTP supplémentaire que le client pourrait traiter ne pouvait pas nécessairement être un bon modèle. JE'

Existe-t-il des modèles d'entreprise prêts à répondre à mes points ouverts? Mon projet de protocole est-il une idée fiable? Je préfère utiliser quelque chose de prêt que de concevoir à partir de zéro.


la source
1
Oui. JWT a conduit de nombreuses personnes à mettre en œuvre des «protocoles» locaux et à mettre de côté le code cadre éprouvé. Pour obtenir la bonne solution, il sera important d'être clair sur les exigences. Cela ressemble à l'expiration de la «session» est une exigence. La déconnexion forcée est-elle obligatoire? c'est-à-dire où quelqu'un du côté serveur peut dire, déconnecter cet utilisateur, ou un utilisateur peut dire déconnecter toutes mes sessions.
joshp

Réponses:

4

JWT ( Intro to JSON Web Token ) n'est qu'un format de jeton, l'authentification est quelque chose de complètement hors de portée pour cette spécification. Il est en effet couramment utilisé dans les systèmes d'authentification, mais vous pouvez également l'utiliser pour des scénarios complètement différents, il est donc logique de ne pas inclure de contraintes spécifiques à l'authentification dans cette spécification.

Si vous recherchez des conseils sur l'authentification, vous devez vous référer à la famille de spécifications OpenID Connect . De plus, si votre système comprend des API HTTP et que vous souhaitez fournir un accès délégué à ces API à votre propre application client ou à une application cliente tierce, vous devez vous référer à la spécification OAuth 2.0 .

Il existe d'autres protocoles liés à l'authentification comme SAML et WS-Federation qui sont encore largement utilisés dans les scénarios d'entreprise, mais ils sont beaucoup plus complexes à mettre en œuvre.

À propos de vos points ouverts spécifiques:

  • Le schéma d'authentification de jeton de support est défini dans la RFC 6750 qui contient des instructions sur la façon d'exécuter les demandes et les codes d'erreur possibles .
  • OAuth2 et OpenID Connect envisagent tous deux la possibilité et définissent la manière d'échanger un nom d'utilisateur / mot de passe avec un jeton.
  • Le problème de l'extension d'une durée de vie d'un jeton autonome / par valeur (JWT) est résolu dans OpenID Connect et OAuth2 par le biais de rafraîchissements de jetons .

Même si OAuth2 et OpenID Connect peuvent être considérés comme plus faciles à implémenter que certains de ses prédécesseurs, ils sont toujours suffisamment complexes pour justifier une certaine prudence et ne les implémentez vous-même que si vous êtes prêt à consacrer beaucoup de temps et de ressources. C'est généralement une meilleure option pour utiliser des bibliothèques ou des services tiers qui font le gros du travail pour vous.

Enfin, ces protocoles couvrent de nombreux scénarios et peuvent donc être exagérés dans certaines situations.

João Angelo
la source
2
+1 pour justifier la prudence et une réponse complète à la question implicite plutôt qu'à la question écrite.
Paul
3

Je ne pense pas que vous ayez besoin d'une chaîne Keepalive. Votre charge utile peut (et il est recommandé de) contenir des informations d'expiration fournies par le serveur (dans la expclé, selon la norme ) lorsque le jeton est généré lors de la connexion. Si un jeton expiré est utilisé (qui, évidemment, est déterminé par le serveur, qui ne fait confiance à ce qu'il contient que si la signature est validée), le serveur le rejette simplement avec HTTP 401, invitant le client à se réauthentifier.

Les clients, quant à eux, peuvent être proactifs. La section de charge utile n'est pas chiffrée, et puisque le client peut la lire, le client peut déterminer quand une demande sera envoyée avec un jeton expiré, et donc appeler à /loginnouveau si le jeton est expiré.

Alternativement, REST permet d'envoyer des informations hypermédia en tant que `` moteur d'état '', et donc si vous le souhaitez, vous pouvez réellement utiliser votre JWT à usage unique et avec une expiration également. Chaque demande générerait alors un nouveau JWT qui est renvoyé dans la réponse au client, soit dans le contenu, soit plus probablement dans un en-tête de réponse, comme le fait hapi-auth-jwt2 .

Paul
la source