Jos haluat suojata arkaluonteista sisältöä Node-sovelluksessasi, tarvitset tavan todentaa käyttäjät. Oman todennusjärjestelmän rakentaminen on kuitenkin monimutkaista ja aikaa vievää, ja jos sitä ei tehdä oikein, se voi tuoda sovellukseesi tietoturva-aukkoja. Kolmannen osapuolen työkalut, kuten Passport, helpottavat todennusta.

Tässä opetusohjelmassa opit toteuttamaan todennus Nodessa Passportin ja MongoDB: n avulla.

Mitä ovat todennus ja valtuutus?

Vaikka todennusta ja valtuutusta käytetään joskus vaihtokelpoisina, näillä kahdella suojauskäsitteellä on eri merkitys. Todennus on prosessi, jolla varmistetaan käyttäjä, kuka hän väittää olevansa, kun taas valtuutus on prosessi, jolla määritetään, onko todennettulla käyttäjällä pääsy tiettyihin sovelluksesi osiin.

Mikä on Passport.js?

Passport.js (tai Passport) on NodeJS: n todennusväliohjelmisto, joka tarjoaa yli 500 strategiaa käyttäjien todentamiseen, mukaan lukien passi-paikallinen joka käyttää käyttäjätunnusta ja salasanaa.

Tämä opetusohjelma käyttää passi-paikallinen ja passi-jwt turvaamaan reitit.

instagram viewer

Kuinka määrittää käyttäjän todennus NodeJS: ssä

Nyt kun tiedät hieman käyttäjien todennuksesta ja Passport.js: stä, voimme katsoa kuinka todennus asetetaan NodeJS: ssä. Alla olemme hahmotellut vaiheet, jotka sinun on suoritettava.

Vaihe 1: Aseta solmupalvelin

Luo kansio nimeltä user-auth-nodejs ja navigoi siihen terminaalillasi.

mkdir user-auth-nodejs. 

cd user-auth-nodejs

Seuraava alustus package.json.

npm init

Koska aiot käyttää Ilmaista, NodeJS-taustajärjestelmä, asenna se suorittamalla seuraava komento.

npm ilmaisen

Luo nyt tiedosto, app.js, ja lisää seuraava koodi palvelimen luomiseksi.

const express = vaatia("express");
const app = express();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Kuuntelee portissa ${PORT}`);
});

Aiheeseen liittyvä: Opi asentamaan Npm ja Node.js Ubuntuun

Vaihe 2: Määritä tietokanta

Tarvitset tietokannan käyttäjätietojen tallentamiseen. Käytät mongoosea luodaksesi MongoDB-tietoskeeman, joka määrittää tietokantaan tallennettavien tietojen rakenteen ja tyypin. Koska tallennat käyttäjätietoja, luo käyttäjäskeema.

Asenna mangoose.

npm olen mangoose

Luo uusi tiedosto, userModel.jsja lisää seuraava.

const mangoose = vaadi ('mangoose')
const {Schema} = mangoose
const UserSchema = uusi Schema ({
sähköposti: {
tyyppi: merkkijono,
vaaditaan: tosi
},
Salasana: {
tyyppi: merkkijono,
vaaditaan: tosi
}
})
const UserModel = mongoose.model('user', UserSchema);
module.exports = UserModel;

Aiheeseen liittyvä: Tietokannan ja kokoelman luominen MongoDB: ssä

Ennen kuin tallennat salasanan, sinun on salattava se turvallisuussyistä. Tulet käyttämään bcryptjs, erittäin hyödyllinen npm-paketti, joka tekee salattujen salasanojen käytöstä helppoa.

Asentaa bcryptjs.

npm ja bcryptjs

Muuttaa usermodel.js salataksesi salasanan ennen sen tallentamista tietokantaan.

const mangoose = vaadi ('mangoose')
const bcrypt = vaatia('bcryptjs');
const {Schema} = mangoose

const UserSchema = uusi Schema ({
...
})
UserSchema.pre('tallenna', async-funktio (seuraava) {
yrittää {
// tarkista rekisteröintitapa
const käyttäjä = tämä;
if (!user.isModified('salasana')) next();
// tuottaa suolaa
const suola = odota bcrypt.genSalt (10);
// tiivistää salasana
const hashedPassword = odota bcrypt.hash (this.password, salt);
// vaihda pelkkä teksti salasana tiivistetyllä salasanalla
this.password = hashedPassword;
Seuraava();
} saalis (virhe) {
palaa seuraavaksi (virhe);
}
});
...
const User = mongoose.model('Käyttäjä', UserSchema);

Tässä käytät a ennakkotallennus koukku muuttaaksesi salasanaa ennen sen tallentamista. Ajatuksena on tallentaa salasanan hash-versio pelkän tekstisalasanan sijaan. Hash on pitkä monimutkainen merkkijono, joka on luotu pelkästä tekstistä.

Käyttää on modifioitu tarkistaaksesi, muuttuuko salasana, koska sinun tarvitsee vain tiivistää uudet salasanat. Luo seuraavaksi suola ja välitä se pelkän tekstin salasanan kanssa hash-menetelmään tiivistetun salasanan luomiseksi. Korvaa lopuksi pelkkä teksti -salasana tietokannan tiivistetyllä salasanalla.

Luo db.js ja määritä tietokanta.

const mangoose = vaatia("mongoose");
mungo. Lupaus = globaali. Lupaus;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on("virhe", () => {
console.log("ei voi muodostaa yhteyttä");
});
db.once("avoin", () => {
console.log("> Yhteys tietokantaan onnistui");
});
};
module.exports = { yhdistä };

Muodosta yhteys tietokantaan app.js: ssa.

// muodosta yhteys db
const db = vaatia('./db');
db.connect();

Vaihe 3: Aseta Passport

Asentaa Passi ja passi-paikallinen. Käytät näitä paketteja käyttäjien rekisteröitymiseen ja kirjautumiseen.

npm i passi
npm i passi-paikallinen

Luo uusi tiedosto, passportConfig.js, ja tuonti passi-paikallinen ja userModel.js.

const LocalStraregy = vaatia("passi-paikallinen").Strategia;
const Käyttäjä = vaatia("./userModel");

Määritä Passport käsittelemään käyttäjän rekisteröintiä.

const LocalStrategy = vaatia("passi-paikallinen");
const Käyttäjä = vaatia("./userModel");
module.exports = (passi) => {
pass.use(
"paikallinen kirjautuminen",
uusi LocalStrategy(
{
usernameField: "email",
passwordField: "salasana",
},
async (sähköposti, salasana, valmis) => {
yrittää {
// tarkista onko käyttäjä olemassa
const userExists = odota User.findOne({ "sähköposti": sähköposti });
if (userExists) {
palautus tehty (nolla, false)
}
// Luo uusi käyttäjä annetuilla käyttäjätiedoilla
const user = odota User.create({ sähköposti, salasana });
palautus tehty (nolla, käyttäjä);
} saalis (virhe) {
tehty (virhe);
}
}
)
);
}

Yllä olevalla koodilla tarkistat, onko sähköposti jo käytössä. Jos sähköpostiosoitetta ei ole olemassa, rekisteröi käyttäjä. Huomaa, että asetat myös käyttäjätunnuskentän hyväksymään sähköpostin. Oletuksena, passi-paikallinen odottaa käyttäjätunnusta, joten sinun on kerrottava sille, että lähetät sen sijaan sähköpostin.

Käyttää passi-paikallinen käsittelemään myös käyttäjän kirjautumista.

module.exports = (passi) => {
pass.use(
"paikallinen kirjautuminen",
uusi paikallinen strategia(
...
)
);
pass.use(
"paikallinen kirjautuminen",
uusi LocalStrategy(
{
usernameField: "email",
passwordField: "salasana",
},
async (sähköposti, salasana, valmis) => {
yrittää {
const user = odota User.findOne({ sähköposti: sähköposti });
if (!user) return done (nolla, false);
const isMatch = odota user.matchPassword (salasana);
jos (!isMatch)
palautus tehty (nolla, false);
// jos salasanat vastaavat paluukäyttäjää
palautus tehty (nolla, käyttäjä);
} saalis (virhe) {
console.log (virhe)
palautus tehty (virhe, väärä);
}
}
)
);
};

Tarkista tästä, onko käyttäjä tietokannassa, ja jos on, tarkista, vastaako annettu salasana tietokannassa olevaa salasanaa. Huomaa, että soitat myös matchPassword() menetelmä käyttäjämallissa, joten siirry kohtaan userModel.js tiedosto ja lisää se.

UserSchema.methods.matchPassword = async-funktio (salasana) {
yrittää {
paluu odottaa bcrypt.compare (salasana, tämä.salasana);
} saalis (virhe) {
heittää uusi Error (error);
}
};

Tämä menetelmä vertaa käyttäjän salasanaa tietokannassa olevaan salasanaan ja palauttaa tosi, jos ne täsmäävät.

Vaihe 4: Määritä todennusreitit

Nyt sinun on luotava päätepisteet, joihin käyttäjät lähettävät tietoja. Ensimmäinen on kirjautumisreitti, joka hyväksyy uuden käyttäjän sähköpostin ja salasanan.

Sisään app.js, käytä juuri luomaasi passin todentamisen väliohjelmistoa käyttäjän rekisteröimiseen.

app.post(
 "/auth/signup",
passport.authenticate('local-signup', { session: false }),
(req, res, next) => {
// Kirjaudu
res.json({
käyttäjä: req.user,
});
}
);

Aiheeseen liittyvä: Todennus vs. Valtuutus: Mitä eroa on?

Jos onnistuu, kirjautumisreitin pitäisi palauttaa luotu käyttäjä.

Luo seuraavaksi kirjautumisreitti.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// Kirjaudu sisään
res.json({
käyttäjä: req.user,
});
}
);

Vaihe 5: Lisää suojattuja reittejä

Toistaiseksi olet käyttänyt Passi luoda väliohjelmisto, joka rekisteröi käyttäjän tietokantaan, ja toinen, joka sallii rekisteröityneen käyttäjän kirjautumisen. Seuraavaksi luot valtuutuksen väliohjelmiston arkaluontoisten reittien suojaamiseksi JSON-verkkotunnuksella (JWT). JWT-valtuutuksen käyttöönotto edellyttää:

  • Luo JWT-tunnus.
  • Välitä tunnus käyttäjälle. Käyttäjä lähettää sen takaisin valtuutuspyynnöissä.
  • Tarkista käyttäjän takaisin lähettämä tunnus.

Tulet käyttämään jsonwebtoken paketti JWT: iden käsittelyyn.

Asenna se suorittamalla seuraava komento.

npm ja jsonwebtoken

Luo seuraavaksi tunnus jokaiselle onnistuneesti sisäänkirjautuneelle käyttäjälle.

Sisään app.js, tuonti jsonwebtoken ja muokkaa kirjautumisreittiä alla olevan mukaisesti.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// Kirjaudu sisään
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1t'}, (err, token) => {
jos (err) {
return res.json({
viesti: "Kirjautuminen epäonnistui",
token: null,
});
}
res.json({
merkki
});
})
}
);

Tosielämän sovelluksessa käyttäisit monimutkaisempaa salaista avainta ja tallentaisit sen asetustiedostoon.

Kirjautumisreitti palauttaa tunnuksen, jos se onnistuu.

Käyttää passi-jwt päästä suojatuille reiteille.

npm i passi-jwt

Sisään passportConfig.js, määritä passi-jwt.

const JwtStrategy = vaadi("passi-jwt").Strategia;
const { ExtractJwt } = vaadi("passi-jwt")
module.exports = (passi) => {
pass.use(
"paikallinen kirjautuminen",
uusi LocalStrategy(
...
);
pass.use(
uusi JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("valtuutus"),
secretOrKey: "secretKey",
},
async (jwtPayload, valmis) => {
yrittää {
// Pura käyttäjä
const user = jwtPayload.user;
tehty (nolla, käyttäjä);
} saalis (virhe) {
tehty (virhe, väärä);
}
}
)
);
};

Huomaa, että poimit JWT: n valtuutusotsikosta pyynnön rungon sijaan. Tämä estää hakkereita sieppaamasta pyyntöä ja tarttumasta tunnukseen.

Nähdäksesi kuinka passi-jwt vartioi reittejä, luo suojattu reitti sisään app.js.

app.get(
"/käyttäjä/suojattu",
passport.authenticate("jwt", { istunto: false }),
(req, res, next) => {
res.json({user: req.user});
}
);

Vain pyyntö, jossa on kelvollinen JWT, palauttaa käyttäjätiedot.

Nyt olet valmis viemään käyttäjätodennuksen uudelle tasolle

Tässä opetusohjelmassa opit, kuinka voit todentaa käyttäjiä sähköpostitse ja salasanalla Passportin avulla. Se saattaa aluksi tuntua pelottavalta, mutta prosessi on suhteellisen yksinkertainen. Voit mennä vielä pidemmälle ja käyttää Passportin tukemia kolmannen osapuolen identiteetin tarjoajia, kuten Twitteriä, Facebookia ja Googlea.

Mikä on käyttäjän todennus ja miten se toimii?

On tärkeää ymmärtää käyttäjien todennuksen perusteet, jotta voit varmistaa verkkotilisi mahdollisimman suuren suojauksen. Joten sukeltakaamme sisään.

Lue Seuraava

JaaTweetSähköposti
Liittyvät aiheet
  • Ohjelmointi
  • Ohjelmointi
  • Ohjelmointikielet
  • Ohjelmointityökalut
Kirjailijasta
Mary Gathoni (8 artikkelia julkaistu)

Mary Gathoni on ohjelmistokehittäjä, jonka intohimona on luoda teknistä sisältöä, joka ei ole vain informatiivinen, vaan myös mukaansatempaava. Kun hän ei koodaa tai kirjoita, hän nauttii ystävien kanssa olemisesta ja ulkoilusta.

Lisää Mary Gathonilta

tilaa uutiskirjeemme

Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e-kirjoja ja eksklusiivisia tarjouksia!

Klikkaa tästä tilataksesi