web-dev-qa-db-fra.com

Où dois-je stocker les jetons d'accès OAuth2?

Je construis un back-end API REST, pour une application mobile. Dans notre choix de conception, nous avons décidé de laisser les fournisseurs OAuth2 gérer la sécurité de connexion.

Cependant, je ne sais pas quelle est la meilleure pratique pour le jeton d'accès, que j'acquiers auprès des fournisseurs OAuth2.

La situation est, j'obtiens un jeton d'accès du fournisseur OAuth2, lorsque l'utilisateur se connecte. Je devrai utiliser ce jeton, chaque fois que l'application mobile fera une demande à mon back-end. Je peux donc valider par rapport au fournisseur OAuth2, pour voir si le jeton est toujours valide.

Je sais que je vais créer un JWT et le remettre à l'application mobile, qu'il utilisera à chaque fois qu'il fera une demande.

Maintenant, ma question est, dois-je stocker le jeton d'accès que j'ai obtenu du fournisseur OAuth2, dans le JWT en tant que revendications.
Ou dois-je le stocker dans une base de données et le connecter avec l'ID utilisateur, que je vais stocker dans les revendications JWT?

Peut-être est-il recommandé de chiffrer le JWT avec JWE? Si tel est le cas, cela réduira-t-il davantage les performances si je décrypte pour chaque demande, plutôt que de faire une recherche dans la base de données (j'utiliserai MongoDB ou Redis) ou l'impact sur les performances sera-t-il le même?

La connexion à mon REST, se fera via HTTPS.

18
Daniel

Si la demande à l'API tierce est via votre serveur, stockez le jeton d'accès dans la base de données liée à l'utilisateur, chiffré avec une clé qui est stockée en tant que variable d'environnement. Si la base de données est compromise, les jetons sont sûrs. (Bonus, cryptez les jetons avec une clé qui est générée et stockée sur l'application mobile.)

Si la demande à l'API tierce provient directement de l'application mobile, stockez le jeton d'accès sur le téléphone, chiffré avec une clé unique pour chaque utilisateur stocké dans la base de données de votre serveur. Le stockage décentralisé des informations sensibles est plus sûr que le stockage centralisé (compartimentation). Si le téléphone est volé, il doit être authentifié sur votre serveur avant d'obtenir la clé de déchiffrement. Si votre serveur est compromis, les jetons ne sont pas là.

Je n'ai pas utilisé JWT.

10
Chloe

Les jetons d'accès sont selon le RFC censés être un accès limité. Plutôt que de se demander où stocker quelque chose de grande valeur où le serveur pourrait être compromis, il est préférable de simplement limiter la durée d'accès au jeton.

Ceci est précisé spécifiquement dans le RFC pour les jetons de porteur:

Émettre des jetons de support de courte durée: les serveurs de jetons DEVRAIENT émettre des jetons de support de courte durée (une heure ou moins), en particulier lors de l'émission de jetons à des clients qui s'exécutent dans un navigateur Web ou dans d'autres environnements où des fuites d'informations peuvent se produire. L'utilisation de jetons au porteur de courte durée peut réduire l'impact de leur fuite.

2
Steve Sether