Kui olete kunagi kasutanud oma Google'i kontot rakendusse sisselogimiseks, siis olete ehk märganud, kui lihtne see on. Peate klõpsama ainult ühte nuppu ja te ei pea sisestama oma e-posti ega parooli. Kuigi see tundub lihtne, on kapoti all toimuv üsna keeruline. Kuid sellised tööriistad nagu Passport muudavad selle lihtsamaks.

Sellest õpetusest saate teada, kuidas rakendada Google'i autentimist Node'is, kasutades Passporti ja Expressi.

Mis on Pass?

Pass (või Passport.js) on sõlme autentimise vahevara, mis pakub rohkem kui 500 strateegiat kasutajate autentimiseks, sealhulgas sotsiaalne autentimine, kasutades selliseid platvorme nagu Google ja Twitter.

Sa kasutad pass-google-oauth2 strateegia kasutajate autentimiseks Google'is.

Google'i autentimissüsteemi loomine Node'is

See on loodava autentimissüsteemi ülevaade:

  • Kui kasutaja klõpsab sisselogimisnupul, suunatakse ta Google'i sisselogimislehele, kus ta sisse logib.
  • Google suunab kasutaja juurdepääsulubaga teie rakenduse juurde. Juurdepääsuluba annab teile loa pääseda juurde selle kasutaja profiiliteabele.
  • Profiiliandmete hankimiseks saatke Google'ile juurdepääsuluba.
  • Looge uus kasutaja või hankige olemasolev kasutaja andmebaasist.
  • Kasutage tundlike marsruutide kaitsmiseks JWT-sid.

Google'i autentimise seadistamine NodeJS-is passi abil

Järgige allolevaid samme, et volitada kasutajaid Google OAuthiga,

1. samm: looge Google'i kliendi ID ja kliendi saladus

Enne Google'i kasutamist kasutajate rakendusse sisselogimiseks peate oma rakenduse Google'is registreerima, et hankida kliendi ID ja kliendi saladus, mida Passporti seadistamisel kasutada.

Logige sisse Google Cloudi konsool ja järgige oma rakenduse registreerimiseks järgmisi samme.

Looge uus projekt. Valige menüüribal Mandaat ja valige ripploendist OAuthi kliendi ID.

Rakenduse tüübi jaoks valige Veebirakendus. Lisage väljale Nimi oma rakenduse eelistatud nimi.

Kasutage volitatud ümbersuunamise URI-de all http://localhost: 3000 ja http://localhost: 3000/auth/google/callback volitatud ümbersuunamise URI-de jaoks.

Klõpsake luua OAuthi kliendi loomiseks. Kuna rakenduse mandaadid on tundlikud, peate looma a .env faili ja lisage sellele kliendi ID ja kliendi saladus.

KLIENDI_ID = 

CLIENT_SECRET =

2. samm: seadistage sõlmeserver

Loo kaust, user-google-auth, ja navigeerige selle juurde.

mkdir user-google-auth
cd kasutaja-google-auth

Initsialiseeri npm looma package.json.

npm init -y

Kuna hakkate kasutama ekspressi luua server, installige see, käivitades järgmise käsu.

npm install express

Avage eelistatud tekstiredaktoriga kaust ja looge uus fail app.js. See toimib teie rakenduse sisenemispunktina.

Looge sisse NodeJS-server app.js.

const express = nõuda("ekspress");
const app = express();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Kuulamine pordis ${PORT}`);
});

2. samm: seadistage MongoDB

Salvestate Google'ilt saadud kasutajaandmed a MongoDB andmebaas. Enne kasutajateabe salvestamist peate määratlema struktuuri, milles andmeid salvestatakse. Mungoose sobib selleks suurepäraselt. See pakub andmemudelite loomiseks üsna lihtsat viisi.

Installige mangust.

npm install mongoose

Looge uus fail userModel.jsja looge kasutajaskeem.

const mongoose = nõuavad("mongoose");
const { Skeem } = mongoose.mudel;
const UserSchema = new Schema({
google: {
id: {
tüüp: string,
},
nimi: {
tüüp: string,
},
email: {
tüüp: string,
},
},
});
const Kasutaja = mongoose.model("Kasutaja", Kasutajaskeem);
module.exports = Kasutaja;

sisse userModel.js, olete importinud mongoose ja loonud uue skeemi.

Pange tähele, et rühmitate teavet Google'ist. See on eriti kasulik, kui kasutate ka muid autentimismeetodeid ja kasutaja kasutab rohkem kui ühte. See muudab topeltregistreerimise vältimise lihtsamaks.

Järgmisena looge db.js.

const mongoose = nõuavad("mongoose");
mangust. Lubadus = globaalne. lubadus;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.ühendus;
db.on("viga", () => {
console.log("ei saanud ühendust");
});
db.once("avatud", () => {
console.log("> Andmebaasi ühendamine õnnestus");
});
};
module.exports = {ühenda};

Ühendage andmebaasiga sisse app.js.

const express = nõuda("ekspress");
const app = express();
const PORT = 3000;
const db = nõua("./db");
db.connect();
app.listen (PORT, () => {
console.log(`Kuulamine pordis ${PORT}`);
});

3. samm: seadistage pass

Installige passi ja pass-google-oauth2.

npm i pass passport-google-oauth2

Looge uus fail, passConfig.jsja importige Google'i strateegia kohast pass-google-oauth2 ja userModel.js.

const GoogleStrategy = nõuda("passport-google-oauth2").Strateegia;
const Kasutaja = nõuda("./userModel");

Kasutage konfigureerimiseks oma rakenduse mandaate passi Google OAuthiga.

module.exports = (pass) => {
passport.use (new GoogleStrategy({
kliendi ID: process.env. CLIENT_ID,
clientSecret: process.env. CLIENT_SECRET,
tagasihelistamise URL: " http://localhost: 3000/auth/google/callback",
passReqToCallback: tõsi
},
async (request, accessToken, refreshToken, profile, done) => {
proovi {
lase olemasolevalKasutaja = oodata User.findOne({ 'google.id': profile.id });
// kui kasutaja on olemas, tagastab kasutaja
if (olemasolevKasutaja) {
tagastamine tehtud (null, olemasolevKasutaja);
}
// kui kasutajat pole, loo uus kasutaja
console.log('Uue kasutaja loomine...');
const newUser = uus kasutaja({
meetod: 'google',
google: {
id: profile.id,
nimi: profile.displayName,
email: profile.emails[0].value
}
});
oota newUser.save();
tagastamine tehtud (null, uuskasutaja);
} püüdmine (viga) {
tagastamine tehtud (viga, vale)
}
}
));
}

Kui olete Google'ilt profiiliteabe kätte saanud, kontrollige, kas kasutaja on andmebaasis olemas. Kui nad seda teevad, tagastage leitud kasutaja. Kui kasutaja on uus, loo andmebaasis uus dokument ja tagasta loodud kasutaja.

Pange tähele, et töötate koos env muutujad, seega kasutage npm pakett dotenv et pääseda neile oma rakenduses juurde.

Installige dotenv.

npm install dotenv

Kasuta dotenv sisse app.js.

nõuda("dotenv").config()

sisse app.js,üle andma passi juurde passConfig.js

const pass = nõuda("pass");
nõuda("./passportConfig")(pass);

4. samm: looge autentimismarsruudid

Teil on vaja kolme marsruuti:

  • Juurdepääsuloa saamiseks suunake kasutaja Google'i sisselogimislehele.
  • Kasutajaandmete toomine saadud juurdepääsuluba kasutades.
  • Pärast seda suuna kasutaja profiililehele edukas autentimine.
// Suunake kasutaja Google'i sisselogimislehele
app.get(
"/auth/google",
passport.authenticate("google", { ulatus: ["e-post", "profiil"] })
);
// Kasutajaandmete toomine saadud juurdepääsuluba kasutades
app.get(
"/auth/google/callback",
passport.authenticate("google", { session: false }),
(req, res) => {
res.redirect("/profiil/");
}
);
// profiili marsruut pärast edukat sisselogimist
app.get("/profile", (req, res) => {
console.log (req);
res.send("Tere tulemast");
});

5. samm: kaitske privaatseid marsruute

Nüüd, kui olete kasutajana sisse loginud, kuidas saate piirata oma rakenduse mõningaid osi ainult autentitud kasutajatele? Üks võimalus selle saavutamiseks on kasutada JSON-i veebimärke (JWT). JWT-d pakuvad turvalist teabe edastamise viisi. To kasutajaid volitada kasutades JWT-sid, teeb teie rakendus järgmist:

  • Looge kasutajaandmeid kasutades luba.
  • Edastage tunnus kasutajale (kasutaja saadab loa tagasi koos autoriseerimist vajavate päringutega).
  • Kontrollige tagasi saadetud luba.
  • Andke kasutajale juurdepääs, kui esitatud tunnus on kehtiv.

Installige jsonwebtoken töötada JWT-dega.

npm installi jsonwebtoken

sisse app.js, importida jsonwebtoken.

const jwt = nõuavad ("jsonwebtoken")

Kasutaja allkirjastamiseks ja loa genereerimiseks muutke Google'i tagasihelistamise URL-i.

app.get(
"/auth/google/callback",
passport.authenticate("google", { session: false }),
(req, res) => {
jwt.sign(
{ user: req.user },
"salajane võti",
{ expiresIn: "1h" },
(err, token) => {
if (err) {
return res.json({
märk: null,
});
}
res.json({
märk,
});
}
);
}
);

Kui logite sisse, saate märgi.

Järgmiseks kasutage pass-jwt, Passporti pakutav JWT strateegia märgi kontrollimiseks ja kasutajate volitamiseks.

npm installi pass-jwt

sisse passConfig.js, lisage JWT strateegia.

const JwtStrategy = nõuda("pass-jwt").Strateegia;
const { ExtractJwt } = nõuda("pass-jwt");
module.exports = (pass) => {
pass.use (uus GoogleStrategy(
// Google'i strateegia
);
pass.use(
uus JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("volitus"),
secretOrKey: "secretKey",
},
async (jwtPayload, tehtud) => {
proovi {
// Kasutaja ekstraktimine
const kasutaja = jwtPayload.user;
tehtud (null, kasutaja);
} püüdmine (viga) {
tehtud (viga, vale);
}
}
)
);
}

Siin eraldate märgi autoriseerimispäisest, kus see on salvestatud – see on palju turvalisem kui selle salvestamine päringu kehasse.

Kui luba on kinnitatud, saadetakse kasutajaobjekt tagasi päringu kehasse. Kasutajate volitamiseks lisage kaitstud marsruutidele passi JWT autentimise vahevara.

app.get(
"/profiil",
passport.authenticate("jwt", { session: false }),
(req, res, next) => {
res.send("Tere tulemast");
}
);

Nüüd saavad juurdepääsu ainult need taotlused, mis sisaldavad kehtivat luba.

Järgmised sammud

See õpetus näitas, kuidas saate Passporti abil kasutajaid oma rakendusse nende Google'i kontoga sisse logida. Passi kasutamine on palju lihtsam kui teiste vormide puhul ja säästate selle kasutamisega palju aega.

Passport pakub ka muid autentimisstrateegiaid, mida saab kasutada koos teiste identiteedipakkujatega, nagu Twitter ja Facebook. Seega tasub ka need üle vaadata.

Kasutaja autentimine NodeJS-is Passporti ja MongoDB abil

Loe edasi

JagaSäutsJagaMeil

Seotud teemad

  • Programmeerimine
  • Turvalisus
  • Programmeerimine
  • Programmeerimistööriistad
  • Google
  • Google Authenticator

Autori kohta

Mary Gathoni (11 artiklit avaldatud)

Mary Gathoni on tarkvaraarendaja, kelle kirg on luua tehnilist sisu, mis pole mitte ainult informatiivne, vaid ka kaasahaarav. Kui ta ei kodeeri ega kirjuta, naudib ta sõpradega aega veetmist ja õues olemist.

Rohkem Mary Gathonist

Liituge meie uudiskirjaga

Liituge meie uudiskirjaga tehniliste näpunäidete, arvustuste, tasuta e-raamatute ja eksklusiivsete pakkumiste saamiseks!

Tellimiseks klõpsake siin