JavaRush /Курсы /Модуль 3: React /Работа с OAuth и SSO для внешней аутентификации

Работа с OAuth и SSO для внешней аутентификации

Модуль 3: React
16 уровень , 8 лекция
Открыта

Введение в OAuth и SSO

OAuth — это открытый стандарт для делегирования доступа. Он позволяет сторонним приложениям получать ограниченный доступ к ресурсам пользователей на других платформах без необходимости раскрывать их логин и пароль. Например, когда вы входите в приложение с помощью кнопки "Войти через Google" или "Войти через GitHub", за кулисами работает именно OAuth.

Основные моменты:

  1. Авторизация, а не аутентификация: OAuth специально создан для делегирования доступа, а не проверки личности.
  2. Токены вместо паролей: при использовании OAuth клиент получает токен (например, Access Token), который позволяет работать с API.
  3. Безопасность: пользователи не передают пароль сторонним сервисам.

Небольшая аналогия для понимания: если JWT — это пропускной билет в парк развлечений, то OAuth — это "родитель" с доверительным письмом, который ведёт вас в этот парк.

Что такое SSO?

SSO (Single Sign-On) — это механизм, который позволяет пользователю входить сразу в несколько связанных систем или приложений, используя только одну пару логина и пароля.

Пример: вы входите в Google, и у вас автоматически появляется доступ к Gmail, YouTube, Google Drive и другим сервисам.

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

  • Пользователь запоминает меньше паролей (а значит, меньше записок с паролями на мониторе).
  • Упрощение управления сессиями.
  • Безопасность: меньше точек входа, меньше риск утечки.

Настройка OAuth в React-приложении

OAuth включает несколько ключевых участников:

  1. Клиент (наше React-приложение) — приложение, которое запрашивает доступ к данным пользователя.
  2. Ресурсный сервер — сервер, где хранятся данные (например, сервер Google).
  3. Авторизационный сервер — сервер, который проверяет пользователя и выдаёт токены (например, сервер Google OAuth).
  4. Пользователь — человек, который разрешает доступ к своим данным.

Процесс выглядит так:

  1. Клиент отправляет пользователя на страницу авторизации (например, Google OAuth).
  2. Пользователь входит в свою учётную запись Google и подтверждает доступ.
  3. Авторизационный сервер выдаёт токен доступа.
  4. Клиент использует токен для работы с API ресурсного сервера.

Установка и подключение библиотеки OAuth

Для интеграции с OAuth в React-приложении мы будем использовать популярную библиотеку react-oauth.

Установка:

npm install @react-oauth/google

Настройка в проекте:

  1. Зарегистрируйте своё приложение в консоли разработчика Google: Google Developer Console.
  2. Получите Client ID для авторизации.
  3. Передайте этот Client ID в компонент GoogleOAuthProvider.

Пример настройки:

import React from 'react';
import { GoogleOAuthProvider, GoogleLogin } from '@react-oauth/google';

const App: React.FC = () => {
  return (
    <GoogleOAuthProvider clientId="ВАШ_GOOGLE_CLIENT_ID">
      <div>
        <h1>Добро пожаловать в приложение!</h1>
        <GoogleLogin
          onSuccess={(credentialResponse) => {
            console.log('Успех:', credentialResponse);
          }}
          onError={() => {
            console.log('Ошибка авторизации');
          }}
        />
      </div>
    </GoogleOAuthProvider>
  );
};

export default App;
Примечание:

для безопасности убедитесь, что ваш Client ID доступен только в безопасной среде. Например, используйте переменные окружения.

Типизация данных OAuth с TypeScript

Давайте добавим типизацию для ответа, который мы получаем от Google.

Создадим интерфейс:

interface GoogleCredentialResponse {
  credential: string;
  select_by: string;
}

Вместо any теперь используем наш интерфейс:

<GoogleLogin
  onSuccess={(credentialResponse: GoogleCredentialResponse) => {
    console.log('Успех:', credentialResponse.credential);
  }}
  onError={() => {
    console.log('Ошибка авторизации');
  }}
/>

Типизация помогает нам избегать ошибок и делает код более читаемым. Например, теперь мы точно знаем, что объект credentialResponse.credential — это строка, а не сюрприз.

Настройка SSO в приложении

SSO часто интегрируется с помощью OAuth. Однако есть сервисы, которые предоставляют больше возможностей, например, Microsoft Active Directory, Okta или Auth0. Мы разберём использование Auth0.

Установка и настройка Auth0

Auth0 — это платформа для аутентификации и авторизации, которая поддерживает SSO.

Установка:

npm install @auth0/auth0-react

Настройка:

  1. Зарегистрируйте приложение на Auth0 Dashboard.
  2. Создайте .env файл для переменных окружения:

    REACT_APP_AUTH0_DOMAIN=ваш-домен.auth0.com
    REACT_APP_AUTH0_CLIENT_ID=ваш-client-id
    
  3. Настройте провайдер в приложении:

    import React from 'react';
    import { Auth0Provider } from '@auth0/auth0-react';
    
    const App: React.FC = ({ children }) => {
      return (
        <Auth0Provider
          domain={process.env.REACT_APP_AUTH0_DOMAIN || ''}
          clientId={process.env.REACT_APP_AUTH0_CLIENT_ID || ''}
          redirectUri={window.location.origin}
        >
          {children}
        </Auth0Provider>
        );
    };
    
    export default App;

Использование хуков Auth0

Auth0 предоставляет хуки для работы с аутентификацией.

Пример входа:

import React from 'react';
import { useAuth0 } from '@auth0/auth0-react';

const LoginButton: React.FC = () => {
  const { loginWithRedirect } = useAuth0();

  return (
    <button onClick={() => loginWithRedirect()}>
      Войти через SSO
    </button>
    );
};

export default LoginButton;

Пример выхода:

const LogoutButton: React.FC = () => {
  const { logout } = useAuth0();

  return (
    <button onClick={() => logout({ returnTo: window.location.origin })}>
      Выйти
    </button>
  );
};

Типизация Auth0 с TypeScript

Auth0 автоматически предоставляет типизацию через свои хуки. Например:

const { user } = useAuth0();

if (user) {
  console.log('Имя пользователя:', user.name);
}

Если вы хотите добавить кастомные типы, вы можете расширить интерфейсы, предложенные библиотекой.

Проблемы и сложности при использовании OAuth и SSO

Проблемы, с которыми вы можете столкнуться:

  1. Разные реализации OAuth: Google, GitHub, Facebook — у всех свои особенности.
  2. Защита токенов: храните Access Token в HttpOnly cookies, а не в localStorage.
  3. Перенаправления: убедитесь, что настроили правильные редиректы после входа.
2
Задача
Модуль 3: React, 16 уровень, 8 лекция
Недоступна
Создание базовой авторизации через Google OAuth
Создание базовой авторизации через Google OAuth
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ