Пользователи и аутентификация

Описание

Общее описание функционала

Пользователи и аутентификация обеспечивают вход в панель управления и защиту операций с туннелями. При новой локальной регистрации в поле Email указывается адрес электронной почты, а в запросе он по-прежнему передаётся в поле login. Это требование относится только к созданию новой учётной записи. Для входа можно использовать сохранённый идентификатор, в том числе прежний логин без адреса электронной почты. После успешной регистрации или входа пользователь остаётся в сессии между визитами и может завершить её выходом из системы. Роль определяет доступ к пользовательским и административным разделам. При необходимости сервис может предложить вход через внешнего провайдера. Учётные записи не объединяются только по совпадению Email: если связь с провайдером ещё не создана, сервис попросит войти с существующим логином и паролем.

Как пользователь может использовать

  • Открыть сайт и создать учётную запись, указав Email, пароль и подтверждение пароля.
  • Войти в панель управления с адресом электронной почты или с ранее сохранённым логином.
  • Продолжить пользоваться существующей учётной записью с непочтовым логином без переоформления данных.
  • Исправить Email при сообщении «Укажите корректный email» и повторить регистрацию.
  • При сообщении о существующей учётной записи после внешнего входа вернуться к форме и войти с сохранённым логином и паролем.
  • При входе через провайдера OpenID Connect использовать адрес, подтверждённый у провайдера; если адрес не подтверждён, вход не выполняется и можно войти с логином и паролем.
  • Войти в панель управления и работать с туннелями без повторного ввода учётных данных в течение сеанса.
  • Использовать бесплатную учётную запись для создания TCP- и UDP-туннелей в пределах назначенных лимитов.
  • Открывать опубликованный адрес как посетитель без входа; если на сервере разрешён гостевой HTTP-режим, он продолжает работать только для HTTP и HTTPS.
  • Выйти из системы, когда сеанс больше не нужен.
  • Получать доступ к защищённым страницам только после успешного входа.
  • Использовать административные разделы, если назначена роль администратора.
  • При блокировке аккаунта администратором — получить понятный отказ при попытке входа или проверки профиля.

Как это реализовано в сервисе

Страница регистрации принимает Email, пароль и подтверждение пароля. Если адрес соответствует правилам регистрации, сервис создаёт учётную запись и устанавливает сессию в браузере. Страница входа проверяет сохранённый идентификатор и пароль; поэтому она остаётся совместимой с прежними логинами. Для создания TCP- или UDP-туннеля сервис проверяет действующую сессию либо Bearer-токен до выделения публичного адреса. Посетителю опубликованного адреса вход не требуется. Гостевое создание HTTP и HTTPS остаётся отдельной настройкой и не даёт права создавать TCP или UDP. При истечении срока неактивности или явном выходе доступ к защищённым операциям прекращается до повторного входа.

Справочник API

Регистрация новой учётной записи

POST /auth/register

Тело JSON: login, password, password_confirm. Запрос нужно отправлять с заголовком Content-Type: application/json; параметры вроде charset=utf-8 допустимы.

  • login — Email для новой локальной учётной записи. Название поля сохранено для совместимости. Пробелы по краям значения игнорируются, после чего принимается один адрес в ASCII-формате: без пробелов внутри, отображаемого имени, комментариев, кавычек и нескольких символов @. Локальная часть содержит от 1 до 64 символов, не начинается и не заканчивается точкой и не содержит двух точек подряд. Домен содержит не менее двух частей, разделённых точками; каждая часть состоит из букв, цифр или дефисов без дефиса в начале и конце, а последняя часть содержит не менее двух букв. Полный адрес не длиннее 254 символов.
  • password — пароль.
  • password_confirm — повтор пароля.

Успех: 201, устанавливается сессионная кука, пользователь считается вошедшим.

При некорректном Email сервис возвращает 400 JSON с кодом invalid_email и сообщением Укажите корректный email. Сеанс при таком ответе не создаётся.

Если логин уже занят или адрес недоступен для самостоятельной регистрации, сервис отвечает 400 с кодом login_taken. Если тело отправлено с другим типом содержимого или без заголовка Content-Type, ответ — 415. В обоих случаях учётная запись и сессия не создаются.

Вход

POST /auth/login-local

Тело JSON: login, password. Как и для регистрации, нужен заголовок Content-Type: application/json; иначе сервис отвечает 415, и сессия не создаётся.

login остаётся обычным идентификатором. Он может быть Email или сохранённым прежним логином без адреса электронной почты. Успех: 200, устанавливается сессионная кука.

Выход

POST /auth/logout

Завершает текущую сессию. Успех: 200 или 204 по политике развёртывания.

Текущий пользователь

GET /auth/me

Возвращает сведения о вошедшем пользователе: authenticated, user (логин, роль и др.).

Требует активной сессии для защищённого ответа.

Внешний провайдер (опционально)

При включённом OIDC/OAuth в развёртывании:

  • GET /auth/login?provider=<name> — перенаправление на провайдера.
  • GET /auth/callback?provider=<name>&code=<code> — обработка ответа провайдера и установка сессии.

Ранее связанная учётная запись определяется по постоянному идентификатору провайдера. Если провайдер впервые возвращает Email, который уже используется другой учётной записью, автоматическое объединение не выполняется: сессия не создаётся, а браузер возвращается к форме входа с сообщением о существующем аккаунте.

При входе через провайдера OpenID Connect адрес электронной почты принимается, только если провайдер подтвердил его. Если адрес не подтверждён, сессия не создаётся, а браузер возвращается к форме входа с сообщением об ошибке.

Конкретные пути и провайдеры зависят от настроек экземпляра сервиса.

Ошибки

Регистрация

СитуацияОтветЧто делать
В поле Email указан адрес, который не подходит для новой регистрации400, код invalid_emailУкажите корректный email: один адрес без пробелов и отображаемого имени, затем повторите регистрацию
Логин уже занят или адрес недоступен для самостоятельной регистрации400, код login_takenВыбрать другой логин. Ответ в обоих случаях одинаковый
Запрос отправлен не как JSON или без заголовка Content-Type: application/json415Отправить тело как JSON и указать заголовок Content-Type: application/json
Пароли не совпадают400Повторить ввод с совпадающим подтверждением
Невалидные данные400Исправить форму по сообщению на экране

Вход

СитуацияОтветЧто делать
Неверный логин или пароль401Проверить Email или сохранённый логин и пароль
Аккаунт заблокирован403, код user_suspendedОбратиться к администратору
Запрос отправлен не как JSON или без заголовка Content-Type: application/json415Отправить тело как JSON и указать заголовок Content-Type: application/json

Сессия

СитуацияОтветЧто делать
Сессия истекла401 на защищённых APIВойти снова
Нет сессии401 или перенаправление на входВойти или зарегистрироваться

Внешний вход

СитуацияОтветЧто делать
Провайдер впервые вернул Email, который уже используется существующей учётной записьюВозврат к форме входа; для прямого обмена токена — 409, код oauth_account_conflictВойти с существующим логином и паролем. Автоматическое объединение учётных записей не выполняется
Провайдер не подтвердил вход или операция была отмененаВозврат к форме входа с сообщением об ошибкеПовторить внешний вход или использовать логин и пароль
Провайдер OpenID Connect не подтвердил адрес электронной почтыВозврат к форме входа с сообщением об ошибке; сессия не создаётсяПодтвердить адрес у провайдера и повторить вход либо войти с логином и паролем

Доступ по роли

СитуацияОтветЧто делать
Обычный пользователь открывает админ-раздел403Использовать учётную запись с ролью администратора

Ограничения

  • Сеанс истекает после периода неактивности; длительность зависит от настроек развёртывания.
  • Вход через внешнего провайдера доступен только если он включён администратором сервиса.
  • Гостевой доступ к туннелям не заменяет регистрацию для защищённых страниц панели.
  • После блокировки аккаунта администратором активные сессии прекращаются при следующей проверке профиля.
  • При регистрации проверяется только синтаксис Email. Сервис не подтверждает владение почтовым ящиком, не отправляет письма и не выполняет проверку MX или DNS.
  • Проверка Email не изменяет существующие учётные записи: это не перенос данных и не требование заменить прежний логин. Непочтовый логин можно использовать для входа через POST /auth/login-local и в форме входа браузера.
  • Повтор адреса определяется без учёта регистра, как и раньше: значение сохраняется в нижнем регистре. Сервис не изменяет точки, часть адреса после + или другие особенности адресов отдельных почтовых сервисов.
  • Внешний вход не объединяет учётные записи только по совпадению Email. Ранее созданная связь с провайдером продолжает работать; для первого входа с уже занятым Email нужно использовать существующий логин и пароль. Отдельного интерфейса объединения учётных записей пока нет.
  • Если сеанс в админ-консоли истёк или вы вышли из системы, браузер перейдёт на главную страницу сервиса, где можно войти снова. После входа откроется список туннелей в личном кабинете, а не админ-консоль.
  • Запросы регистрации и входа принимаются только в формате JSON с заголовком Content-Type: application/json. Интеграция, которая отправляет форму или обычный текст, получает 415.
  • Самостоятельная регистрация не даёт права администратора. Адреса, которые владелец сервиса назначил администраторами, через форму зарегистрировать нельзя: ответ такой же, как для занятого логина. Административный доступ выдаёт владелец сервиса или внешний вход с подтверждённым адресом.
  • Вход через провайдера OpenID Connect принимает только адрес электронной почты, который подтвердил провайдер. Неподтверждённый адрес приводит к отказу во входе, учётная запись при этом не создаётся.

Дополнения

Вход через Яндекс

Общее описание функционала

Вход через Яндекс — дополнительный способ аутентификации через внешний провайдер. Функция доступна только в развёртываниях, где администратор включил и настроил этот способ входа. Сервис не объединяет учётные записи только по совпадению Email.

Как пользователь может использовать

  • На странице входа выбрать кнопку продолжения через Яндекс, если она показана.
  • Подтвердить вход на стороне Яндекса и вернуться в дашборд с созданной или ранее связанной учётной записью.
  • Если Email уже относится к существующей учётной записи, вернуться к форме и войти с сохранённым логином и паролем.
  • Использовать обычный логин и пароль, если внешний способ входа отключён или недоступен.

Как это реализовано в сервисе

Сервис перенаправляет пользователя к провайдеру и получает подтверждение личности через обратный переход. Ранее созданная связь с Яндексом открывает тот же аккаунт. Для нового пользователя сервис создаёт отдельную учётную запись только при свободном Email. Если Email уже занят или провайдер не подтвердил вход, сессия не создаётся и пользователь возвращается к форме входа.

Внешний вход

Когда дополнение включено, страница аутентификации показывает кнопку внешнего входа. После подтверждения провайдер возвращает пользователя в сервис, где создаётся обычная сессия.

Ранее связанный пользователь определяется по постоянному идентификатору Яндекса. При первом входе новый пользователь создаётся только для свободного Email. Если Email уже занят, браузер возвращается к форме входа без сессии. Прямой обмен токена возвращает 409 с кодом oauth_account_conflict.

Ошибка внешнего входа

Провайдер не подтвердил личность или пользователь отменил вход. Повторите операцию или используйте вход по логину и паролю.

Email уже используется

При первом входе Яндекс вернул Email существующей учётной записи. Сервис не объединяет аккаунты автоматически и не создаёт сессию. Войдите с сохранённым логином и паролем. При прямом обмене токена ответ имеет статус 409 и код oauth_account_conflict.

Ограничения

  • Вход работает только в развёртываниях, где дополнение и провайдер включены.
  • Доступность зависит от внешнего провайдера и его сетевой доступности.
  • Роли и создание локальной учётной записи зависят от политики сервиса.
  • Совпадение Email не объединяет аккаунты автоматически. Если связь с Яндексом ещё не создана, используйте существующий логин и пароль. Отдельного интерфейса объединения аккаунтов пока нет.
  • Сервис запрашивает у Яндекса только доступ к адресу электронной почты. Имя, фото и другие данные профиля не запрашиваются и в аккаунт не переносятся.