Tout comme l’authentification est importante dans les API, c’est également une fonctionnalité importante dans certaines applications Web: celles qui contiennent des pages et des secrets qui ne devraient être accessibles qu’aux utilisateurs enregistrés et authentifiés..
Dans ce didacticiel, vous allez créer une application Web simple tout en apprenant à créer un enregistrement d’utilisateur..
Créez un nouveau répertoire à partir duquel vous allez travailler. Par souci de ce tutoriel, j’ai appelé le mien site-auth. Initialisez npm dans le nouveau répertoire que vous venez de créer. Voici comment initialiser npm.
npm init -y
le -y
flag indique à npm d'utiliser les options par défaut.
Editez les dépendances de votre package.json déposer pour ressembler à ce que j'ai dans le mien.
# package.json "name": "site-auth", "version": "1.0.0", "description": "", "main": "app.js", "scripts": "test" : "echo \" Erreur: aucun test spécifié \ "&& exit 1", "keywords": [], "author": "izuchukwu1", "license": "ISC", "dépendances": "bcryptjs": "^ 2.4.3", "analyseur de corps": "^ 1.17.1", "connect-flash": "^ 0.1.1", "analyseur de cookie": "^ 1.4.3", "express": "^ 4.15.2", "express-guidon": "^ 3.0.0", "express-messages": "^ 1.0.1", "express-session": "^ 1.15.2", "joi": "^ 13.0.1", "mangouste": "^ 4.11.12", "morgan": "^ 1.8.1", "passeport": "^ 0.4.0", "passport-local": "^ 1.0. 0 "
Ceci fait, exécutez la commande pour installer les dépendances..
npm installer
Créez un fichier dans votre répertoire de travail appelé app.js.
Commencez par demander les dépendances que vous avez installées et les fichiers nécessaires.
# app.js const express = require ('express'); const morgan = require ('morgan') const path = require ('path'); const cookieParser = require ('cookie-parser'); const bodyParser = require ('analyseur de corps'); const expressHandlebars = require ('express-guidon'); const flash = require ('connect-flash'); const session = require ('express-session'); const mongoose = require ('mongoose') const passport = require ('passport') require ('./ config / passport')
Ces dépendances ont été installées lors de l'exécution de npm install. Pour les utiliser dans votre application, vous devez les demander et les enregistrer dans leurs constantes respectives..
Pour ce tutoriel, vous utiliserez MongoDB comme base de données. Vous aurez besoin de stocker les informations utilisateur dans la base de données. Pour utiliser MongoDB, vous utiliserez Mongoose, un outil de modélisation MongoDB pour Node.js. Installer Mongoose est facile, comme ça.
# app.js mongoose.Promise = global.Promise mongoose.connect ('mongodb: // localhost: 27017 / site-auth')
À ce stade, configurons notre middleware.
// 1 const app = express () app.use (morgan ('dev')) // 2 app.set ('views', path.join (__ nom de répertoire, 'views')) app.engine ('guidon', expressHandlebars (defaultLayout: 'layout')) app.set ('view engine', 'handlebars') // 3 app.use (bodyParser.json ()) app.use (bodyParser.urlencoded (extended: false )) app.use (cookieParser ()) app.use (express.static (path.join (__ dirname, 'public'))) app.use (session (cookie: maxAge: 60000, secret: 'codeworkrsecret' , saveUninitialized: false, resave: false)); app.use (passport.initialize ()) app.use (passport.session ()) // 4 app.use (flash ()) app.use ((req, res, next) => res.locals.success_mesages = req.flash ('success') res.locals.error_messages = req.flash ('error') next ()) // 5 app.use ('/', require ('./ routes / index')) app.use ('/ users', require ('./ routes / users')) // 6 // attrape 404 et transfère au gestionnaire d'erreurs app.use ((req, res, next) => res.render ( 'pas trouvé') ); // 7 app.listen (5000, () => console.log ('Le serveur a commencé à écouter sur le port 5000!'))
app
.guidon
.bodyparser
, biscuit
, session
, et passeport
. Passport sera utilisé lorsque les utilisateurs veulent se connecter.Créez un nouveau répertoire appelé vues. Dans le répertoire views, créez deux autres répertoires appelés mises en page et partiels. Vous souhaitez obtenir une telle arborescence dans vos vues, créez donc les fichiers nécessaires dans leurs répertoires respectifs..
Dashboard.handlebars ├── index.handlebars ├── agencements layout.handlebars login.handlebars notFound.handlebars ├── partiels navbar.handlebars enregistrer .guidon
Cela fait, il est temps de laisser tomber le code.
# dashboard.handlebarsTableau de bord utilisateur
Ceci est un tableau de bord qui ne devrait être visible que par les utilisateurs enregistrés. Pour ce tutoriel, ce sera votre page secrète.
Maintenant, la page d'index de l'application devrait ressembler à ceci.
# index.handlebarsAuthentification du site!
Bienvenue à bord.
L'application a besoin d'une mise en page qui sera utilisée, et voici la mise en page que vous allez utiliser.
# layout / layout.handlebarsAuthentification du site #if success_messagessuccess_messages/ if #if error_messagesmessages d'erreur/si> barre de navigation body
Vous aurez besoin d'une page de connexion pour les utilisateurs enregistrés.
# views / login.handlebars
le pas trouvé.guidon le fichier sera utilisé comme page d'erreur.
# views / notFound.handlebarsErreur
Votre page d'inscription est supposée ressembler à ceci.
Enfin pour vos vues, voici votre barre de navigation.
# partials / navbar.handlebarsAuthentification du site
Cela fait, vous êtes bon pour aller dans certaines parties profondes.
Vous aurez besoin d'un modèle utilisateur. A partir du code de vues ci-dessus, vous pouvez en déduire que les propriétés requises pour le modèle User sont email, nom d'utilisateur et mot de passe. Créez un répertoire appelé des modèles, et un fichier appelé user.js.
# models / user.js // 1 mongoose const = require ('mongoose') const Schema = mongoose.Schema const bcrypt = require ('bcryptjs') // 2 const userSchema = nouveau Schema (email: String, nom d'utilisateur: String , mot de passe: Chaîne, // 3 horodatages: createdAt: 'createdAt', updatedAt: 'updatedAt') // 4 const User = mongoose.model ('user', userSchema) module.exports = User
email
, Nom d'utilisateur
, et mot de passe
à la base de données. Le schéma montre comment le modèle doit être construit pour chaque document. Ici, vous voulez que l'email, le nom d'utilisateur et le mot de passe soient du type String.horodatage
. Vous utilisez Mongoose pour obtenir le créé à
et updatedAt
, et cela est ensuite enregistré dans la base de données.Utilisateur
, qui est ensuite exporté en tant que module afin qu'il puisse être utilisé dans d'autres parties de l'application.Vous ne souhaitez pas stocker les mots de passe des utilisateurs sous forme de texte brut. Voici ce que vous voulez faire lorsqu'un utilisateur entre un mot de passe en texte brut lors de son inscription. Le mot de passe en texte brut doit être haché à l'aide d'un sel qui sera généré par votre application (à l'aide de bcryptjs). Ce mot de passe haché est ensuite stocké dans la base de données.
Ça sonne bien, non? Mettons cela en œuvre dans le user.js fichier.
# models / user.js module.exports.hashPassword = async (mot de passe) => try const salt = wait bcrypt.genSalt (10) retourne wait bcrypt.hash (mot de passe, salt) catch (error) lance new Error ('Echec du hachage', erreur)
Vous venez de créer une méthode qui sera appelée dans les événements d’enregistrement de l’utilisateur. La méthode recevra le mot de passe en texte brut saisi par l'utilisateur. Comme je l'ai mentionné précédemment, le mot de passe en texte brut sera haché à l'aide d'un sel généré. Le mot de passe haché sera retourné comme mot de passe pour l'utilisateur.
Créez un nouveau répertoire appelé itinéraires. Dans ce nouveau répertoire, créez deux nouveaux fichiers: index.js et utilisateurs.js.
le index.js le fichier sera très simple. Il mappera à l'index de votre application. N'oubliez pas que vous avez configuré un middleware pour vos itinéraires dans votre app.js déposer quand vous avez fait cela.
app.use ('/', require ('./ routes / index')) app.use ('/ utilisateurs', require ('./ routes / utilisateurs'))
Donc, votre route d'index, qui rend simplement la page d'index, devrait ressembler à ceci.
# routes / index.js const express = require ('express') const routeur = express.Router () router.get ('/', (req, res) => res.render ('index')) .exports = routeur
Passons maintenant à la route des utilisateurs. Pour l'instant, ce fichier de route fera quatre choses.
.email()
ce qui garantit que ce qui est entré correspond au format de courrier électronique, tandis que le mot de passe est validé à l'aide d'une expression régulière. Pour le mot de passe de confirmation, vous voulez qu'il soit identique au mot de passe entré. Ces validations sont effectuées à l'aide de Joi.Voici à quoi ressemble le code.
# routes / users.js const express = require ('express'); const router = express.Router () const Joi = require ('joi') const passport = require ('passport') const User = require ('… / models / user') // schéma de validation const userSchema = Joi.object ( ) .keys (email: Joi.string (). email (). required (), nom d'utilisateur: Joi.string (). required (), mot de passe: Joi.string (). regex (/ ^ [a-zA- Z0-9] 6,30 $ /). Required (), confirmationPassword: Joi.any (). Valid (Joi.ref ('password')). Required ()) router.route ('/ register' ) .get ((req, res) => res.render ('register')) .post (async (req, res, next) => try const result = Joi.validate (req.body, userSchema ) if (result.error) req.flash ('error', 'Les données saisies ne sont pas valides. Veuillez réessayer.') res.redirect ('/ users / register') return const user = wait User.findOne ( 'email': result.value.email) if (utilisateur) req.flash ('error', 'l'email est déjà utilisé.') res.redirect ('/ users / register') return const hash = wait User.hashPassword (result.value.password) delete result.value.confirmationPassword result.value.password = hash const newUser = attend le nouvel utilisateur (result.value) attend newUser.save () req.flash ('success', 'Enregistrement réussi, allez-y et connectez-vous.') res.redirect ('/ users / login') catch (error ) next (error)) module.exports = routeur
Regardons plus profondément dans ce qui se passe dans ce POSTER demande.
Les valeurs saisies dans le formulaire d’inscription sont accessibles via req.body
, et les valeurs ressemblent à ceci.
valeur: email: '[email protected]', nom d'utilisateur: 'izu', mot de passe: 'chinedu', confirmationPassword: 'chinedu',
Ceci est validé en utilisant le userSchema
vous avez créé ci-dessus et les valeurs entrées par l'utilisateur sont affectées à une constante appelée résultat.
Si une erreur survient à cause de la validation, un message d'erreur est affiché à l'utilisateur et une redirection vers la page d'enregistrement a lieu..
Sinon, nous essayons de trouver si un utilisateur avec la même adresse email existe, car vous ne voulez pas que deux utilisateurs ou plus aient la même adresse email. Si un utilisateur est trouvé, il est informé que l'adresse e-mail est déjà utilisée.
Dans un scénario où aucun utilisateur enregistré ne possède cette adresse électronique, l'étape suivante consiste à hacher le mot de passe. C’est là que vous appelez le hashPassword
méthode que vous avez créée dans votre fichier user.js. Le nouveau mot de passe haché est attribué à une constante appelée hash.
Il n'y a pas besoin de stocker le confirmationPassword
dans la base de données. Ainsi, ceci est supprimé. Le mot de passe disponible à partir du résultat est toujours le mot de passe en clair. Étant donné que vous ne souhaitez pas stocker le mot de passe en clair dans votre base de données, il est important de réaffecter la valeur du mot de passe au hachage créé. Ceci est fait avec une ligne de code.
result.value.password = hash
La nouvelle instance d'utilisateur est enregistrée dans la base de données. Un message flash indiquant que l'enregistrement a réussi est affiché et l'utilisateur est redirigé vers la page de connexion..
Démarrez votre serveur depuis votre terminal en lançant:
noeud app.js
Pointez votre navigateur sur http: // localhost: 5000 et vous devriez voir votre nouvelle application..
Vous savez maintenant comment implémenter la fonctionnalité d'enregistrement dans une application Web Node. Vous avez appris l'importance de valider les entrées de l'utilisateur et comment le faire avec Joi. Vous avez également utilisé bcryptjs
saler et hacher votre mot de passe.
Ensuite, vous verrez comment implémenter une fonctionnalité de connexion pour les utilisateurs enregistrés. J'espère que vous vous êtes bien amusé!