Guest User

Untitled

a guest
Dec 10th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1. # Authentification avec Passport.js
  2.  
  3. Passport.js est un middleware permettant de gérer l'authentification. Il s'intègre très bien avec Express.js. L'authentification est le processus de vérification qu'un utilisateur est bien celui qu'il prétend être.
  4.  
  5. Notre système d'authentification utilisera un JSON web token.
  6.  
  7. ## Comprendre ce qu'est un JSON web token (JWT)
  8.  
  9. Un JWT permet à un utilisateur de certifier certaines informations. Il est composé de 3 parties:
  10.  
  11. - le header
  12. - le payload
  13. - la signature
  14.  
  15. Chacune de ces parties est séparée par une point.
  16.  
  17. ```
  18. header.payload.signature
  19. ```
  20.  
  21. Exemple de JWT:
  22.  
  23. ```
  24. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  25. ```
  26.  
  27. - le header contient les informations liées au JWT, et particulièrement l'algorithme utilisé pour signer le JWT. (encodé en base64)
  28. - le paylad contient les informations certifiées par le JWT. Par exemple, je suis le user ABC. (encodé en base64)
  29. - la signature correspond à la concaténation du header et du payload encodé en base64, puis signé avec l'algorithme du header et un secret (ou une clé privée).
  30.  
  31. Ces informations sont ensuite misent bout à bout comme ci-dessus et constitue le JWT.
  32.  
  33. ## Sécurité
  34.  
  35. Le JWT n'assure aucune sécurité au niveau de vos données qui sont dans le payload. **Aucune**. Le payload est **encodé** en base64 pour qu'il puisse être transmit plus facilement, mais peut être décodé. Le payload et le header sont **signés** pour permettre à un système de vérification de l'authenticité de vos "prétentions" (je suis le user ABC). Le JWT n'est **pas encrypté**, et donc vos données sont **lisibles**.
  36.  
  37. ## La vérification du JWT
  38.  
  39. Il y a 2 types d'algorithmes pour les JWTs.
  40.  
  41. - les algorithmes dit symétrique (que nous utiliserons dans ce TP), c'est à dire que l'on utilise la même information pour signer et pour vérifier la signature. On l'appelle le `secret`.
  42. - les algorithmes dit asymétrique, qui utilise deux informations différentes, une pour signé (la clé privée), et une pour vérifier la signature (la clé publique).
  43.  
  44. L'avantage des algorithmes asymétriques est qu'ils permettent à une application de vérifier l'identité d'un utilisateur sans pouvoir créer de JWT.
  45.  
  46. Dans notre cas, nous avons un `secret`. Le JWT que l'utilisateur nous envoie contient les 3 parties `header.payload.signature`. Pour vérifier que le JWT est valide, nous allons signer à nouveau la partie `header.payload` et vérifier que la signature obtenu est bien la même. Si c'est bien le cas, le JWT est considéré comme valide et le serveur peut faire confiance aux informations du payload.
  47.  
  48. ## Mettre en place un système d'authentification avec Passport.js
  49.  
  50. ### Dépendances
  51.  
  52. Passport.js utilise des `strategies` pour authentifier ses utilisateurs. Une stratégie peut par exemple être d'aller chercher un utilisateur dans une base de données pour vérifier son existance, et une autre d'appeler une API pour vérifier un user.
  53.  
  54. Dans notre cas notre stratégie sera de faire de la vérification de JWT, nous allons donc installer les dépendances correspondantes. Créez un nouveau dossier avec un fichier index.js puis:
  55.  
  56. ```
  57. npm init -y
  58. npm install express --save
  59. npm install jsonwebtoken --save
  60. npm install passport --save
  61. npm install passport-jwt --save
  62. ```
  63.  
  64. ### Génération du JWT
  65.  
  66. nous allons créer une application express simple:
  67.  
  68. ```js
  69. const express = require('express')
  70.  
  71. const app = express()
  72.  
  73. app.get('/public', (req, res) => {
  74. res.send('I am public folks!')
  75. })
  76.  
  77. app.get('/private', (req, res) => {
  78. res.send('Hello XXX')
  79. })
  80.  
  81. app.post('/login', (req, res) => {
  82. res.json({
  83. jwt: '' // TODO
  84. })
  85. })
  86.  
  87. app.listen(3000, () => {
  88. console.log('app running on port 3000')
  89. })
  90. ```
  91.  
  92. **Exercice 1:** Grâce à la librairie `jsonwebotken` que vous avez installé, renvoyez un JWT contenant le payload:
  93.  
  94. ```js
  95. {
  96. test: 'jwt'
  97. }
  98. ```
  99.  
  100. Ce JWT doit être signé avec l'algorithme HS256, un algorithme symétrique.
  101.  
  102. **Exercice 2:** Ajoutez un tableau d'utilisateurs prédéfinis (email-password), et faîtes en sorte que, lors d'un login, votre fonction récupère dans le body les informations de login et vérifie ces informations dans le tableau. Elle renvoie le JWT d'un user avec le payload suivant en cas de succès:
  103.  
  104. ```js
  105. {
  106. user: 'email@goes.here'
  107. }
  108. ```
  109.  
  110. et renvoie une erreur si l'utilisateur ou le mot de passe ne correspondent pas.
  111.  
  112. ### Envoie et vérification du JWT
  113.  
  114. Le but de cet exercice va être d'utiliser le middleware passport et la stratégie passport-jwt pour vérifier le jwt d'un user dans les routes réservées aux utilisateurs.
  115.  
  116. **Exercice 3:** Ajoutez le middleware passport ainsi que la stratégie JWT afin de vérifier qu'un utilisateur est valide quand il fournit son JWT pour accéder à la route `/private`. La route doit répondre 'Hello ADRESSE-EMAIL'.
  117.  
  118. Note: Pour pouvoir tester votre route, il faut envoyer votre JWT dans une header:
  119.  
  120. ```
  121. Authorization: 'Bearer VOTREJWTICI'
  122. ```
  123.  
  124. Vous pouvez faire ça avec postman dans la section header.
Add Comment
Please, Sign In to add comment