Рубрики
Без рубрики

Краткое введение в OAuth с использованием Passport.js

OAuth (Open Authorization) – это протокол авторизации. Стороннее приложение может использовать его для доступа к данным пользователя с сайта (например, Google или Twitter) без раскрытия его пароля. которое реализует аутентификацию в веб-приложениях на базе Express.

Что такое OAuth?

OAuth (Open Authorization) – это протокол авторизации. Стороннее приложение может использовать его для доступа к данным пользователя с сайта (например, Google или Twitter) без раскрытия его пароля. Такие сайты, как Quora, Medium, AirBnb и многие другие, предлагают аутентификацию с помощью OAuth.

OAuth действительно упрощает нашу жизнь, избавляя от необходимости помнить пароль каждой учетной записи, которую вы создаете практически на любом сайте. Вам нужно помнить только пароль основной учетной записи OAuth-провайдера.

Что такое Passport.js?

Passport – это промежуточное программное обеспечение, которое реализует аутентификацию в веб-приложениях на базе Express. Он предоставляет более 500+ стратегий. Что это за стратегии? Стратегии используются для аутентификации запросов. Каждая стратегия имеет свой собственный пакет npm (например, passport-twitter, passport-google-oauth20). Стратегия должна быть настроена перед использованием.

Зачем использовать Passport.js?

Вот шесть причин, по которым вы должны использовать Passport:

  • Он легкий
  • Легко настраивается
  • Поддерживает постоянные сессии
  • Предлагает OAuth
  • Предоставляет отдельные модули для каждой стратегии
  • Дает вам возможность реализовать пользовательские стратегии

Давайте создадим что-нибудь

Чтобы начать работу, нам нужно установить passport из NPM:

npm install passport 

Мы собираемся создать простое приложение, которое предоставляет пользователю доступ к секретному маршруту, только если он войдет в систему. В этом руководстве я буду использовать стратегию passport-google-oauth20. Не стесняйтесь использовать любую другую стратегию, которую вы предпочитаете, но не забудьте проверить документацию, чтобы узнать, как она настроена.

Прежде чем продолжить, нам понадобятся clientID и clientSecret. Чтобы получить их, перейдите на https://console.developers.google.com и создайте новый проект. Затем перейдите в раздел Enable APIs and Services и включите API Google+. Выберите API и нажмите на кнопку “Создать учетные данные“.

Заполните форму и используйте один и тот же URL обратного вызова как в форме, так и в вашем файле. Обязательно прочитайте комментарии к коду, чтобы понять, как все сочетается.

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('/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="/auth/google">Login</a></li>
    <li><a href="/secret">Secret</a></li>
    <li><a href="/logout">Logout</a></li>
</ul>

Как вы видите, мы создали маршрут /secret и предоставляем доступ к нему только в том случае, если пользователь аутентифицирован. Чтобы проверить, аутентифицирован ли пользователь, мы создали промежуточное ПО, которое проверяет, есть ли в запросе объект пользователя. Наконец, для выхода из системы мы использовали метод req.logout(), предоставляемый passport, чтобы очистить сессию.

Вот некоторые ресурсы, позволяющие узнать больше о паспорте

Заключение

Мы рассмотрели здесь только одну стратегию. Существует еще 500+ стратегий. Я настоятельно рекомендую вам просмотреть официальную документацию Passport и узнать, что еще они предлагают. Спасибо, что нашли время прочитать эту статью. Желаю вам удачи!

Оригинал: “https://www.freecodecamp.org/news/a-quick-introduction-to-oauth-using-passport-js-65ea5b621a/”