authentification / role avec passport, jwt et bcrypt
npm i -S bcrypt-nodejs jsonwebtoken morgan passport passport-jwt passport-local dotenv
cf. auth
cf. auth helper createGenericPassoword
Ajouter les champs email, pwd, role à la table user
cf. setup.sql l.38 à 60
Un pwd générique pourra être généré avec le helper
-
notExists(email)
pour vérifier qu'un utilisateur avec le même mail n'existe pas => utilisé à la creation de l'utilisateur (register) -
getUserByEmail
: Récupérer le user à partir d'un email- BUT FINAL : créer
checkCredentials
qui prend en paramètre email et password envoyés par le user afin de récupérer le hash du password correspondant à l'email pour, au final, comparer avec le password envoyé avec le pwd hashé répéré dans la BDD => utilisé pour le login
- BUT FINAL : créer
-
getUserById
Récupérer le user à partir d'un id- BUT FINAL : vérification du token
- Ajouter les nouveaux champs (email , pwd, role)
- Verifier la présence de l'email
- Verifier la présence du password
- Verifier que l'utilisateur n'exite pas dejà :
notExists(email)
- Encoder le password avant de l'insérer dans la base
Créer un fichier auth/passport.js pour :
- initialiser une strategie pour le login : local
- initialiser une strategie pour les routes d'api et les routes front : jwt
- exposer les middlewares correspondants.
-
qui utilise le middleware de passport-local OU PAS
- Dans le controlleur de la route login, générer un token (Ce code est dejà ecrit !!)
- Ajouter le middleware checkTokenMiddleware sur une route à protéger
- Verifier via postman que la route est bien protégé
- générer un token avec POSTMAN (comment faire... au fait c'est très simple)
- Ajouter un token dans la requete pour être autorisé à accéder à la route
-
qui génére et renvoie le token
-
qui renvoie eventuellement les infos du user.
- Un pour limiter l'acces à l'admin
- Un pour limiter l'acces à l'owner du compte
- Un pour empecher un user de bouger une carte à laquelle il n'est pas associé
- Créer un routes.js qui centralise les path, middleware et controller associés
- Extraire login et register du user pour faire un controller spécialisé dans l'authentification
- Créer un model et controller pour les action impliquant user et card afin d'alléger les model et controller de user
- Avec jest et super-test ?
- http://www.albertgao.xyz/2017/05/24/how-to-test-expressjs-with-jest-and-supertest/
- https://www.valentinog.com/blog/testing-api-koa-jest/
- https://medium.com/@linuk/unit-testign-rest-api-file-upload-with-jest-supertest-and-mz-in-node-ecbab9814aef
- https://github.com/juffalow/express-jwt-example Mocha / chai mais bon exemple
- https://github.com/Shyam-Chen/Backend-Starter-Kit intéressant
- https://www.snip2code.com/Snippet/248401/Supertest-authenticate-with-bearer-token utilise le login pour recuperezr le token
- avec JOI
- ou avec express-validator
Attention en particulier aux injection SQL. Mais il y plein d'autres attaques possibles.
- le onDelete d'une list pour mettre toutes les user.cards de cette liste sur la liste par défaut.