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— стратегия для Googlepassport-github2— стратегия для GitHubexpress-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')
);
Профиль пользователя и выход
Добавим маршруты для просмотра профиля и выхода из системы.
Также в библиотеке
Конфигурация приложений Kotlin: библиотеки и инструменты для управления настройками
wiremock-rs для Rust: полное руководство с примерами
Миграции баз данных в TypeScript: полное руководство по инструментам и подходам
WireMock для Java: полное руководство с примерами
Лучшие библиотеки логирования для Go (Golang): обзор и сравнение