Jos olet joskus käyttänyt Google-tiliäsi kirjautumiseen sovellukseen, olet ehkä huomannut, kuinka helppoa se on. Sinun tarvitsee vain napsauttaa yhtä painiketta, eikä sinun tarvitse kirjoittaa sähköpostiosoitettasi tai salasanaasi. Vaikka tämä näyttää yksinkertaiselta, se, mitä tapahtuu konepellin alla, on melko monimutkaista. Passportin kaltaiset työkalut tekevät siitä kuitenkin helpompaa.
Tässä opetusohjelmassa opit toteuttamaan Google-todennuksen Nodessa Passportin ja Expressin avulla.
Mikä on passi?
Passi (tai Passport.js) on Node-todennusväliohjelmisto, joka tarjoaa yli 500 strategiaa käyttäjien todentamiseen, mukaan lukien sosiaalinen todennus Googlen ja Twitterin kaltaisten alustojen avulla.
Tulet käyttämään pass-google-oauth2 strategia käyttäjien todentamiseksi Googlessa.
Google-todennusjärjestelmän luominen Nodessa
Tämä on yleiskatsaus luomastasi todennusjärjestelmästä:
- Kun käyttäjä napsauttaa kirjautumispainiketta, hänet ohjataan Googlen kirjautumissivulle, jolla hän kirjautuu sisään.
- Google ohjaa käyttäjän sovellukseesi käyttötunnuksella. Käyttöoikeustunnus antaa sinulle oikeuden käyttää kyseisen käyttäjän profiilitietoja.
- Lähetä käyttöoikeustunnus Googlelle saadaksesi profiilitiedot.
- Luo uusi käyttäjä tai hae olemassa oleva käyttäjä tietokannasta.
- Käytä JWT: itä suojaamaan herkkiä reittejä.
Google-todennuksen määrittäminen NodeJS: ssä Passportin avulla
Valtuuta käyttäjiä Google OAuthilla noudattamalla alla olevia ohjeita,
Vaihe 1: Luo Google-asiakastunnus ja asiakassalaisuus
Ennen kuin käytät Googlea käyttäjien kirjaamiseen sovellukseesi, sinun on rekisteröitävä sovelluksesi Googlelle, jotta saat asiakastunnuksen ja asiakassalaisuuden käytettäväksi Passportin määrittämisessä.
Kirjaudu sisään Google Cloud -konsoli ja rekisteröi sovelluksesi noudattamalla seuraavia ohjeita.
Luo uusi projekti. Valitse valikkopalkista Valtuustiedot ja valitse avattavasta luettelosta OAuth-asiakastunnus.
Valitse sovellustyypiksi verkkosovellus. Lisää haluamasi nimi sovelluksellesi Nimi-kenttään.
Käytä valtuutettujen uudelleenohjaus-URI-osoitteiden alla http://localhost: 3000 ja http://localhost: 3000/auth/google/callback valtuutetuille uudelleenohjaus-URI: ille.
Klikkaus luoda luodaksesi OAuth-asiakkaan. Koska sovelluksen tunnistetiedot ovat arkaluonteisia, sinun on luotava a .env tiedosto ja lisää siihen asiakastunnus ja asiakkaan salaisuus.
CLIENT_ID =CLIENT_SECRET =
Vaihe 2: Asenna solmupalvelin
Luo kansio, user-google-auth, ja navigoi siihen.
mkdir user-google-auth
cd user-google-auth
Alustaa npm luoda package.json.
npm init -y
Koska aiot käyttää ilmaista luo palvelin, asenna se suorittamalla seuraava komento.
npm install express
Avaa kansio haluamallasi tekstieditorilla ja luo uusi tiedosto app.js. Se toimii hakemuksesi sisääntulopisteenä.
Luo NodeJS-palvelin sisään app.js.
const express = vaatia("express");
const app = express();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Kuuntelee portissa ${PORT}`);
});
Vaihe 2: Asenna MongoDB
Tallennat Googlelta saamasi käyttäjätiedot a MongoDB-tietokanta. Ennen kuin tallennat käyttäjätiedot, sinun on määritettävä rakenne, johon tiedot tallennetaan. Mongoose on täydellinen tähän. Se tarjoaa melko suoraviivaisen tavan luoda tietomalleja.
Asentaa mungo.
npm asenna mongoose
Luo uusi tiedosto userModel.jsja luo käyttäjäskeema.
const mangoose = vaatia("mongoose");
const { Kaavio } = mongoose.model;
const UserSchema = new Schema({
Google: {
id: {
tyyppi: merkkijono,
},
nimi: {
tyyppi: merkkijono,
},
sähköposti: {
tyyppi: merkkijono,
},
},
});
const User = mongoose.model("Käyttäjä", UserSchema);
module.exports = Käyttäjä;
Sisään userModel.js, olet tuonut mangustin ja luonut uuden mallin.
Huomaa, että ryhmittelet tietoja Googlesta. Tämä on erityisen hyödyllistä, kun käytät myös muita todennusmenetelmiä ja käyttäjä käyttää useampaa kuin yhtä. Se helpottaa kaksoisrekisteröinnin estämistä.
Seuraavaksi luo db.js.
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ä };
Yhdistä tietokantaan sisään app.js.
const express = vaatia("express");
const app = express();
const PORT = 3000;
const db = vaatia("./db");
db.connect();
app.listen (PORT, () => {
console.log(`Kuuntelee portissa ${PORT}`);
});
Vaihe 3: Aseta Passport
Asentaa passi ja pass-google-oauth2.
npm i passport passport-google-oauth2
Luo uusi tiedosto, passportConfig.jsja tuo Google-strategia osoitteesta pass-google-oauth2 ja userModel.js.
const GoogleStrategy = vaatia("passi-google-oauth2").Strategia;
const Käyttäjä = vaatia("./userModel");
Käytä sovelluksesi kirjautumistietoja määrittämiseen passi Google OAuthin kanssa.
module.exports = (passi) => {
passport.use (uusi GoogleStrategy({
asiakastunnus: process.env. ASIAKASTUNNUS,
clientSecret: process.env. CLIENT_SECRET,
callbackURL: " http://localhost: 3000/auth/google/callback",
passReqToCallback: tosi
},
async (pyyntö, accessToken, refreshToken, profiili, valmis) => {
yrittää {
anna olemasolevaKäyttäjä = odottaa User.findOne({ 'google.id': profile.id });
// jos käyttäjä on olemassa, palauttaa käyttäjän
if (existingUser) {
palautus tehty (nolla, olemassa oleva käyttäjä);
}
// jos käyttäjää ei ole olemassa, luo uusi käyttäjä
console.log('Luodaan uutta käyttäjää...');
const newUser = uusi käyttäjä({
menetelmä: 'google',
Google: {
id: profile.id,
nimi: profiili.näyttönimi,
sähköposti: profile.emails[0].value
}
});
odota newUser.save();
palautus tehty (nolla, uusi käyttäjä);
} saalis (virhe) {
palautus tehty (virhe, väärä)
}
}
));
}
Kun olet saanut profiilitiedot Googlelta, tarkista, onko käyttäjä tietokannassa. Jos he tekevät niin, palauta löydetty käyttäjä. Jos käyttäjä on uusi, luo uusi dokumentti tietokantaan ja palauta luotu käyttäjä.
Huomaa, että työskentelet env muuttujia, joten käytä npm paketti dotenv päästäksesi niihin sovelluksessasi.
Asentaa dotenv.
npm asennus dotenv
Käyttää dotenv sisään app.js.
vaatia("dotenv").config()
Sisään app.js,kulkea passi kohtaan passportConfig.js
const passi = vaatia("passi");
vaatia("./passportConfig")(passi);
Vaihe 4: Luo todennusreitit
Tarvitset kolme reittiä:
- Ohjaa käyttäjä Googlen kirjautumissivulle saadaksesi pääsytunnuksen.
- Hae käyttäjätiedot vastaanotetun käyttöoikeustunnuksen avulla.
- Ohjaa käyttäjä profiilisivulle tämän jälkeen onnistunut todennus.
// Ohjaa käyttäjä Googlen kirjautumissivulle
app.get(
"/auth/google",
passport.authenticate("google", { soveltamisala: ["sähköposti", "profiili"] })
);
// Hae käyttäjätiedot vastaanotetun käyttöoikeustunnuksen avulla
app.get(
"/auth/google/callback",
passport.authenticate("google", { istunto: false }),
(req, res) => {
res.redirect("/profiili/");
}
);
// profiilireitti onnistuneen sisäänkirjautumisen jälkeen
app.get("/profiili", (req, res) => {
console.log (req);
res.send("Tervetuloa");
});
Vaihe 5: Suojaa yksityiset reitit
Nyt kun olet kirjautunut sisään käyttäjänä, kuinka voit rajoittaa joitain sovelluksesi osia koskemaan vain todennettuja käyttäjiä? Yksi tapa tehdä se on käyttää JSON Web Tokens (JWT) -tunnusta. JWT: t tarjoavat turvallisen tavan siirtää tiedot. Vastaanottaja valtuuttaa käyttäjiä käyttämällä JWT: tä, sovelluksesi:
- Luo tunnus käyttämällä käyttäjätietoja.
- Välitä tunnus käyttäjälle (käyttäjä lähettää tunnuksen takaisin valtuutusta vaativilla pyynnöillä).
- Vahvista takaisin lähetetty tunnus.
- Myönnä käyttäjälle käyttöoikeus, jos esitetty tunnus on kelvollinen.
Asentaa jsonwebtoken työskentelemään JWT: n kanssa.
npm asentaa jsonwebtoken
Sisään app.js, tuonti jsonwebtoken.
const jwt = vaatia("jsonwebtoken")
Muokkaa Googlen takaisinsoitto-URL-osoitetta allekirjoittaaksesi käyttäjän ja luodaksesi tunnuksen.
app.get(
"/auth/google/callback",
passport.authenticate("google", { istunto: false }),
(req, res) => {
jwt.sign(
{ user: req.user },
"salainen avain",
{ expiresIn: "1h" },
(err, token) => {
jos (err) {
return res.json({
token: null,
});
}
res.json({
merkki,
});
}
);
}
);
Jos kirjaudut sisään, saat tunnuksen.
Seuraavaksi käytä passi-jwt, Passportin tarjoama JWT-strategia tunnuksen tarkistamiseksi ja käyttäjien valtuuttamiseksi.
npm asennus pass-jwt
Sisään passportConfig.js, lisää JWT-strategia.
const JwtStrategy = vaadi("passi-jwt").Strategia;
const { ExtractJwt } = vaatia("passi-jwt");
module.exports = (passi) => {
passport.use (uusi GoogleStrategy(
// Googlen strategia
);
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ä);
}
}
)
);
}
Tässä poimit tunnuksen valtuutusotsikosta, johon se on tallennettu – mikä on paljon turvallisempaa kuin sen tallentaminen pyynnön runkoon.
Kun tunnus on vahvistettu, käyttäjäobjekti lähetetään takaisin pyynnön runkoon. Voit valtuuttaa käyttäjiä lisäämällä passin JWT-todennusväliohjelmiston suojatuille reiteille.
app.get(
"/profiili",
passport.authenticate("jwt", { istunto: false }),
(req, res, next) => {
res.send("Tervetuloa");
}
);
Nyt vain pyynnöt, jotka tarjoavat kelvollisen tunnuksen, saavat pääsyn.
Seuraavat vaiheet
Tämä opetusohjelma osoitti, kuinka Passportin avulla voit kirjautua sisään sovellukseesi käyttämällä Google-tiliä. Passportin käyttäminen on paljon yksinkertaisempaa kuin muiden lomakkeiden, ja säästät paljon aikaa käyttämällä sitä.
Passport tarjoaa myös muita todennusstrategioita käytettäväksi muiden identiteetintarjoajien, kuten Twitterin ja Facebookin, kanssa. Kannattaa siis tutustua niihinkin.
Käyttäjän todennus NodeJS: ssä Passportin ja MongoDB: n avulla
Lue Seuraava
Liittyvät aiheet
- Ohjelmointi
- Turvallisuus
- Ohjelmointi
- Ohjelmointityökalut
- Google Authenticator
Kirjailijasta
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.
tilaa uutiskirjeemme
Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia e-kirjoja ja eksklusiivisia tarjouksia!
Klikkaa tästä tilataksesi