OAuth клиент для JavaScript (Node.js): обзор и примеры использования

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

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

Начать курс

Обзор библиотек OAuth клиента для JavaScript (Node.js)

OAuth (Open Authorization) — это открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к ресурсам пользователя без передачи логина и пароля. В экосистеме Node.js существует несколько зрелых библиотек, реализующих OAuth 2.0 и OAuth 1.0a. В этой статье мы рассмотрим три самых популярных решения: simple-oauth2, oauth4webapi и Passport.js с его стратегиями. Вы узнаете, как выбрать подходящий инструмент и как интегрировать его в ваш проект.

1. simple-oauth2 — универсальный OAuth 2.0 клиент

simple-oauth2 — это легковесная библиотека, которая предоставляет чистый API для работы с OAuth 2.0. Она поддерживает все основные гранты (authorization code, client credentials, password, refresh token). Идеально подходит для серверных приложений, где нужен полный контроль над процессом.

Установка

npm install simple-oauth2

Пример: авторизация через GitHub

const express = require('express');
const simpleOAuth2 = require('simple-oauth2');
const app = express();

const config = {
  client: {
    id: 'ВАШ_CLIENT_ID',
    secret: 'ВАШ_CLIENT_SECRET'
  },
  auth: {
    tokenHost: 'https://github.com',
    tokenPath: '/login/oauth/access_token',
    authorizePath: '/login/oauth/authorize'
  }
};

const oauth2 = new simpleOAuth2.ClientCredentials(config);

// Маршрут для начала авторизации
app.get('/auth/github', (req, res) => {
  const authorizationUri = oauth2.authorizeURL({
    redirect_uri: 'http://localhost:3000/callback',
    scope: 'user:email'
  });
  res.redirect(authorizationUri);
});

// Callback маршрут
app.get('/callback', async (req, res) => {
  const { code } = req.query;
  try {
    const result = await oauth2.getToken({
      code,
      redirect_uri: 'http://localhost:3000/callback'
    });
    const accessToken = oauth2.createToken(result);
    console.log('Access Token:', accessToken.token.access_token);
    res.send('Авторизация прошла успешно!');
  } catch (error) {
    console.error('Ошибка получения токена', error);
    res.status(500).send('Ошибка авторизации');
  }
});

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

2. oauth4webapi — современный стандарт

oauth4webapi — это реализация последних спецификаций OAuth 2.0 и OpenID Connect. Библиотека не имеет внешних зависимостей, поддерживает PKCE (Proof Key for Code Exchange) и работу с JWK (JSON Web Keys). Рекомендуется для новых проектов, где важна безопасность и соответствие стандартам.

Установка

npm install oauth4webapi

Пример: авторизация с PKCE

const express = require('express');
const { AuthorizationServer, Client, generateCodeVerifier, generateCodeChallenge } = require('oauth4webapi');
const app = express();

// Конфигурация сервера авторизации (Google)
const issuer = new URL('https://accounts.google.com');
const server = new AuthorizationServer(issuer);
const client = new Client({
  client_id: 'ВАШ_CLIENT_ID',
  client_secret: 'ВАШ_CLIENT_SECRET',
  redirect_uris: ['http://localhost:3000/callback']
});

app.get('/auth/google', async (req, res) => {
  const codeVerifier = generateCodeVerifier();
  const codeChallenge = await generateCodeChallenge(codeVerifier);
  
  // Сохраняем codeVerifier в сессии
  req.session.codeVerifier = codeVerifier;

  const authorizationUrl = new URL(server.authorization_endpoint);
  authorizationUrl.searchParams.set('client_id', client.client_id);
  authorizationUrl.searchParams.set('redirect_uri', client.redirect_uris[0]);
  authorizationUrl.searchParams.set('response_type', 'code');
  authorizationUrl.searchParams.set('scope', 'openid profile email');
  authorizationUrl.searchParams.set('code_challenge', codeChallenge);
  authorizationUrl.searchParams.set('code_challenge_method', 'S256');

  res.redirect(authorizationUrl.toString());
});

app.get('/callback', async (req, res) => {
  const { code } = req.query;
  const codeVerifier = req.session.codeVerifier;

  try {
    const tokenResponse = await client.authorizationCodeGrant(
      server,
      client,
      code,
      client.redirect_uris[0],
      codeVerifier
    );
    console.log('ID Token:', tokenResponse.id_token);
    res.send('Авторизация через Google успешна!');
  } catch (error) {
    console.error('Ошибка:', error);
    res.status(500).send('Ошибка авторизации');
  }
});

app.listen(3000);

3. Passport.js — фреймворк аутентификации

Passport.js — это не просто OAuth клиент, а полноценный фреймворк для аутентификации в Express-приложения

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