web-dev-qa-db-fra.com

JWT Vérifier côté client?

J'ai une api nodejs avec une interface angulaire. L'API utilise avec succès JWT avec un passeport pour sécuriser ses points de terminaison. 

Je suis maintenant conscient qu'après expiration des jetons, mon serveur frontal permettra toujours à l'utilisateur de demander mes points de terminaison api sans l'inviter à entrer à nouveau dans son journal pour obtenir un nouveau jeton. 

Voici comment mon serveur génère le jeton:

function generateToken(user) {
  return jwt.sign(user, secret, {
    expiresIn: 10080 // in seconds
  });
}

Donc, pour implémenter cette logique, je pense avoir besoin de vérifier le jeton JWT côté client. Q1, est-ce une approche sensée? 

Q2, la bibliothèque JWT que j'utilise semble nécessiter une clé publique pour utiliser sa fonction verify(). Je ne semble pas avoir de clé publique, mais seulement un secret, que je viens de inventer, alors cela n’a pas été généré avec une paire. D'où vient ma clé publique ou existe-t-il un autre moyen de vérifier mon jeton sans cela? 

Tout cela semble être évident et que j'ai oublié quelque chose, alors excuses-moi si cette question est stupide, mais je n'arrive pas à trouver la réponse?

7
George Edwards

Q1: La vérification des jetons sur le client est une mauvaise idée. Ce que vous pouvez faire est de sauvegarder un jeton avec la même date d'expiration sur le client, puis d'actualiser/supprimer un jeton. Mais j’ai pensé qu’il était préférable d’avoir une vérification de date côté serveur car la règle simple existe: Ne faites pas confiance au client parce qu’il peut toujours envoyer du code malveillant. 

Q2: JWT n'a pas besoin de clé publique. La clé privée doit toujours être stockée côté serveur, car si quelqu'un qui connaît votre clé secrète, votre jeton n'a aucun sens. Vous pouvez uniquement ajouter des données utiles pour le rendre plus complexe.

1
Dmitry

Je pense que la vérification du jeton JWT côté client n'est pas une bonne idée.
IMO;

  1. Chaque fois qu'un utilisateur se connecte, générez l'accès, actualisez le jeton et renvoyez quelque chose comme ceci.

    { "accessToken": <<accessToken>> "refreshToken": <<refreshToken>> "expiresAt": <<expiresAt>> } 

    Ainsi, le client peut comprendre quand le jeton d'accès expire et peut l'actualiser avec un jeton d'actualisation.

  2. Cryptez les données que vous avez insérées dans le jeton d'accès car il est possible d'accéder aux données sans clé secrète. Mais bien sûr, il faut que la clé secrète soit vérifiée. 

0
ugursogukpinar