Ce este OAuth?

OAuth (Open Authorization) este un protocol de autorizare. O aplicație terță parte o poate utiliza pentru a accesa datele utilizatorului de pe un site (cum ar fi Google sau Twitter) fără a le dezvălui parola. Site-uri precum Quora, Medium, AirBnb și multe altele oferă autentificare utilizând OAuth.

OAuth ne face viața mai simplă, eliminând necesitatea de a ne aminti parola fiecărui cont pe care îl creați pe aproape orice site. Trebuie doar să vă amintiți parola principală a furnizorului dvs. OAuth.

Ce este Passport.js?

Pașaport este un middleware care implementează autentificarea pe aplicații web bazate pe Express. Oferă peste 500 de strategii. Care sunt aceste strategii? Strategiile sunt folosite pentru autentificarea solicitărilor. Fiecare strategie are propriul pachet npm (cum ar fi pașaport-twitter, pașaport-google-oauth20). O strategie trebuie configurată înainte de utilizare.

De ce să folosiți Passport.js?

Iată șase motive care indică motivul pentru care ar trebui să utilizați Pașaport:

  • Este ușor
  • Ușor configurabil
  • Suportă sesiuni persistente
  • Oferă OAuth
  • Oferă module separate pentru fiecare strategie
  • Vă oferă posibilitatea de a implementa strategii personalizate

Să construim ceva

Pentru a începe, trebuie să instalăm pașaportul de la NPM:

npm install passport 

Vom construi o aplicație simplă care să ofere utilizatorului acces la o rută secretă doar dacă se conectează. Voi folosi pașaport-google-oauth20 strategie în acest tutorial. Simțiți-vă liber să utilizați orice altă strategie preferați, dar asigurați-vă că verificați documente pentru a vedea cum este configurat.

Înainte de a continua, avem nevoie de un clientID și clientSecret. Pentru a obține unul, mergeți la https://console.developers.google.com și să creeze un nou proiect. Apoi accesați Activați API-urile și serviciile și activați API-ul Google+. Selectați API-ul și faceți clic pe creați acreditări.

Completați formularul și utilizați aceeași adresă URL de apel invers atât pe formular, cât și pe fișierul dvs. Asigurați-vă că citiți comentariile de pe cod pentru a afla cum se potrivește totul.

app.js

// Required dependencies 
const express = require('express');
const app = express();
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20');
const cookieSession = require('cookie-session');

// cookieSession config
app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000, // One day in milliseconds
    keys: ['randomstringhere']
}));

app.use(passport.initialize()); // Used to initialize passport
app.use(passport.session()); // Used to persist login sessions

// Strategy config
passport.use(new GoogleStrategy({
        clientID: 'YOUR_CLIENTID_HERE',
        clientSecret: 'YOUR_CLIENT_SECRET_HERE',
        callbackURL: 'http://localhost:8000/auth/google/callback'
    },
    (accessToken, refreshToken, profile, done) => {
        done(null, profile); // passes the profile data to serializeUser
    }
));

// Used to stuff a piece of information into a cookie
passport.serializeUser((user, done) => {
    done(null, user);
});

// Used to decode the received cookie and persist session
passport.deserializeUser((user, done) => {
    done(null, user);
});

// Middleware to check if the user is authenticated
function isUserAuthenticated(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.send('You must login!');
    }
}

// Routes
app.get('/', (req, res) => {
    res.render('index.ejs');
});

// passport.authenticate middleware is used here to authenticate the request
app.get("https://www.freecodecamp.org/auth/google", passport.authenticate('google', {
    scope: ['profile'] // Used to specify the required data
}));

// The middleware receives the data from Google and runs the function on Strategy config
app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => {
    res.redirect('/secret');
});

// Secret route
app.get('/secret', isUserAuthenticated, (req, res) => {
    res.send('You have reached the secret route');
});

// Logout route
app.get('/logout', (req, res) => {
    req.logout(); 
    res.redirect('/');
});

app.listen(8000, () => {
    console.log('Server Started!');
});

index.ejs

<ul>
    <li><a href="https://www.freecodecamp.org/auth/google">Login</a></li>
    <li><a href="http://www.freecodecamp.org/secret">Secret</a></li>
    <li><a href="http://www.freecodecamp.org/logout">Logout</a></li>
</ul>

După cum puteți vedea, am creat un /secret rută și acordați acces la acesta numai dacă utilizatorul este autentificat. Pentru a verifica dacă utilizatorul este autentificat, am creat un middleware care verifică dacă cererea are obiectul utilizatorului în ea. În cele din urmă, pentru a ne deconecta am folosit req.logout() metoda furnizată de pașaport pentru a șterge sesiunea.

Iată câteva resurse pentru a afla mai multe despre pașaport

https://www.youtube.com/watch?v=videoseries

Documentația oficială a Passport.js
Autentificare simplă, discretă pentru Node.jswww.passportjs.org

Concluzie

Aici am văzut o singură strategie. Mai sunt 500+. Vă recomand cu tărie să parcurgeți oficialul Passport documentație și aflați ce mai oferă. Vă mulțumim că v-ați luat timp să citiți acest lucru Simțiți-vă liber să vă conectați cu mine pe LinkedIn, Stare de nervozitate și GitHub. Iti urez noroc!

„Faceți ceea ce este minunat, scris pe un monitor de computer.” de Martin Shreder pe Unsplash

Articolul anterior

O introducere rapidă la proiectarea materialelor folosind Materialize
Ce este proiectarea materialelor?medium.freecodecamp.org