Bonjour à tous et à toutes,
Je viens faire appel à vous car depuis plusieurs mois, je bloque sur un soucis d’authentification. Je souhaite sécuriser mon site web, une application mobile ainsi que mon API web qui rend le tout un peu plus vivant.
Au fil des semaines, j’en ai appris de plus en plus sur l’authentification. OpenID, OAuth2 ainsi que les JWT qui semblent être utilisés dans ces deux premières techniques.
J’ai donc choisi d’utiliser les JWT pour authentifier les utilisateurs et donc, leur donner des autorisations…ou non.
Actuellement, ma méthode d’authentification pour un site web fonctionne. Mais je suis très moyennement convaincu de sa mise en place.
Le soucis aussi est le fait de devoir utiliser des cookies en mode "httpOnly
". Donc interdits aux langages de script tels que JavaScript. Cela dit…en regardant de plus près, les quelques sites que j’ai vérifié (minecraft.net) et quelques autres n’utilisent pas cette propriété…Je ne comprends pas pourquoi du coup, surtout qu’ils ne semblent pas transmettre les données en JavaScript, mais pas des cookies…Donc "httpOnly
" devrait être à "true
"…
Actuellement, lorsque je vais sur une page qui charge des éléments à l’aide de mon API (avec XmlHttpRequest
) et que mon jeton a expiré le PHP se charge de le rafraichir aussitôt sans prévenir le client et effectue un "setCookie
" pour ensuite utiliser les jetons (JWT et Refresh Tokens) tout fraichement créés.
Ce que j’aimerais faire ce serait de créer un système d’authentification qui soit commun à mon site ainsi qu’à l’application mobile.
J’ai donc pensé utiliser le JavaScript afin de mettre les jetons de la façon suivante lors de ma requête HTTP :
HTTP REQUEST -> Header = Authorization : Bearer <MON JETON>
Mais non ! Car mon JavaScript n’a pas accès au jeton pour une question de sécurité. Et ça m’embête vraiment. Et j’ai trouvé quelques forums anglais qui parlent de ce soucis…mais les réponses ne sont jamais très claires.
https://community.auth0.com/t/isnt-storing-a-jwt-in-a-non-httponly-cookie-just-as-insecure-as-local-storage/33922 https://security.stackexchange.com/questions/179498/is-it-safe-to-store-a-jwt-in-sessionstorage
J’ai beaucoup de mal à comprendre les enchaînements d’étapes :
- J’accède à une ressource protégée (on passe le JETON dans un entête ou dans un cookie)
- Jeton invalide détecté.
- Création d’un nouveau jeton grâce au "refresh token".
Et là ? Je renvoie une réponse au format JSON pour que le client puisse agir selon le cas (token valide et données récupérées ou token invalide et erreur retournée) afin de le stocker dans le navigateur (
localStorage
/sessionStorage
) Ou bien je me débrouille différemment avec des cookies "httpOnly
"…donc sans JavaScript.
Je suis en train de me noyer dans des tonnes d’onglets et d’informations sans jamais vraiment avancer… C’est tellement frustrant.
Je vois qu’il est déconseillé (à utiliser que si l’on connait les risques) d’utiliser le "localStorage
" et "sessionStorage
" en JavaScript pour le stockage de jetons JWT…Sauf que comme je l’ai mentionné plus haut, certains sites connus ou professionnels n’utilisent pas le fameux "httpOnly
". Donc l’utilisation du JavaScript devrait être possible puisque les jetons sont accessibles à n’importe quel script malicieux…
A votre avis, dois-je utiliser les cookies à tout prix pour le WEB et le Mobile (j’ai vu que ça existe dessus) ? Il semble que dans ce cas là, il faille utiliser un jeton CSRF pour protéger notre cookie.
Ou est-ce que je peux m’autoriser à simplifier mon développement en utilisant le JavaScript et l’entête Authorization Bearer <MON JETON>
et effectuer quelque chose de semblable pour une application mobile ?
Bref…j’ai selon moi eu à faire à de nombreuses contradictions lorsque j’ai mis en place mon système d’authentification…
Comment feriez-vous pour gérer ses soucis de JavaScript, de "httpOnly
" et pour le rafraichissement de jetons ? Ou stockeriez-vous les jetons ?
Si vous avez besoin d’explications ou d’éclaircissements, n’hésitez pas. Ça fait sans doute fouillis et ça l’est aussi dans ma tête…
Merci infiniment pour votre aide. A bientôt !