OAuth клиент для Node.js: реализация авторизации через Google и GitHub

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

OAuth клиент для JavaScript (Node.js): полное руководство

OAuth (Open Authorization) — это открытый протокол, который позволяет предоставить стороннему приложению ограниченный доступ к ресурсам пользователя без передачи ему логина и пароля. В мире Node.js реализация OAuth клиента — одна из самых частых задач при создании современных веб-приложений. В этой статье мы подробно разберём, как написать собственный OAuth клиент для авторизации через Google и GitHub, используя популярную библиотеку Passport.js.

Что такое OAuth 2.0 и зачем он нужен?

OAuth 2.0 — это стандарт, используемый для делегирования доступа. Вместо того чтобы хранить пароли пользователей на своём сервере, вы перенаправляете их на страницу провайдера (Google, GitHub, Facebook), где они дают согласие. После этого ваше приложение получает access token (токен доступа), с помощью которого может обращаться к API провайдера от имени пользователя.

Основные преимущества:

  • Безопасность — пароли не хранятся на вашем сервере.
  • Удобство для пользователя — не нужно регистрироваться заново.
  • Гибкость — можно запрашивать только те данные, которые действительно нужны (scope).

Установка необходимых пакетов

Для работы с OAuth в Node.js мы будем использовать следующие библиотеки:

  • express — веб-фреймворк
  • passport — middleware для аутентификации
  • passport-google-oauth20 — стратегия для Google
  • passport-github2 — стратегия для GitHub
  • express-session — для хранения сессий

Установите их одной командой:

npm install express passport passport-google-oauth20 passport-github2 express-session

Базовая настройка сервера

Создадим файл app.js и подключим все необходимые модули:

const express = require('express');
const passport = require('passport');
const session = require('express-session');
const app = express();

// Настройка сессий
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: true
}));

app.use(passport.initialize());
app.use(passport.session());

// Заглушка для сериализации пользователя
passport.serializeUser((user, done) => done(null, user));
passport.deserializeUser((obj, done) => done(null, obj));

app.listen(3000, () => console.log('Сервер запущен на порту 3000'));

Настройка OAuth стратегии для Google

Перед началом работы вам нужно зарегистрировать приложение в Google Cloud Console и получить Client ID и Client Secret. Укажите в настройках redirect URI: http://localhost:3000/auth/google/callback.

const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(new GoogleStrategy({
    clientID: 'ВАШ_GOOGLE_CLIENT_ID',
    clientSecret: 'ВАШ_GOOGLE_CLIENT_SECRET',
    callbackURL: 'http://localhost:3000/auth/google/callback'
}, (accessToken, refreshToken, profile, done) => {
    // Здесь вы можете сохранить профиль в базу данных
    return done(null, profile);
}));

// Маршруты для Google OAuth
app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));

app.get('/auth/google/callback', 
    passport.authenticate('google', { failureRedirect: '/' }),
    (req, res) => res.redirect('/profile')
);

Настройка OAuth стратегии для GitHub

Для GitHub зарегистрируйте OAuth App в GitHub Developer Settings. Homepage URL: http://localhost:3000, Authorization callback URL: http://localhost:3000/auth/github/callback.

const GitHubStrategy = require('passport-github2').Strategy;

passport.use(new GitHubStrategy({
    clientID: 'ВАШ_GITHUB_CLIENT_ID',
    clientSecret: 'ВАШ_GITHUB_CLIENT_SECRET',
    callbackURL: 'http://localhost:3000/auth/github/callback'
}, (accessToken, refreshToken, profile, done) => {
    return done(null, profile);
}));

// Маршруты для GitHub OAuth
app.get('/auth/github', passport.authenticate('github', { scope: ['user:email'] }));

app.get('/auth/github/callback', 
    passport.authenticate('github', { failureRedirect: '/' }),
    (req, res) => res.redirect('/profile')
);

Профиль пользователя и выход

Добавим маршруты для просмотра профиля и выхода из системы.

Рекомендаций