Пользователь — это человек, который может войти через клиента, зарегистрированного в Versola: OAuth resource owner. Versola хранит каждого пользователя один раз, в auth, независимо от числа тенантов, клиентов и ресурсов. Эта страница описывает экран Users по полям. Общая картина — в разделе Сущности, пошаговые действия — в Как зарегистрировать пользователя.
Прежде чем начать
Чтобы открыть Users и искать, нужно разрешение users:read. Для создания и правки пользователей, выхода с устройств, удаления устройств из памяти, отзыва offline-доступа, сброса паролей и лимитов и удаления пользователя нужно users:manage; с одним users:read страница показывает все, но этих кнопок не предлагает. Роли, Reset limits и Reset password работают в выбранном в боковом меню тенанте, поэтому сначала выберите его. Без тенанта страница говорит об этом, скрывает Roles и отключает две эти кнопки.
Пользователи не привязаны к тенанту: у человека одна идентичность на всю платформу. По тенантам разделены его роли — пользователь может быть администратором в одном тенанте и обычным пользователем в другом.
Поиск

Пока вы не ищете, экран никого не показывает. Выберите Login, Email, Phone или ID и введите значение. Совпадение точное по этому одному полю, результат — не больше одного пользователя: частичного поиска и подстановочных знаков нет. Номер телефона нормализуется так же, как при сохранении, поэтому +14155552671 находит пользователя, как бы номер ни был записан при создании.
Пока вы печатаете, селектор подстраивается под значение: UUID выбирает ID, ведущий + — Phone, символ @ — Email, все остальное — Login. Вручную его все равно можно изменить.

Результат — таблица с именем и ID пользователя, Email, Phone и Login. Имя берется из claim name либо из claims с именем и фамилией; если их нет, показывается No name — это запасной вариант отображения, а не правило проверки. Нажмите на строку или выберите Open в ее меню, чтобы открыть пользователя. Copy ID копирует ID пользователя.
Страница пользователя

Страница открывается по адресу ?view=users&id=<ID пользователя>, поэтому ссылкой можно поделиться, а страницу — перезагрузить. В шапке — имя, ID пользователя с кнопкой копирования, метка User и, пока пользователь вошел хотя бы на одном устройстве, метка Signed in. У каждой карточки, которую можно менять, своя кнопка Edit: она открывает только эту группу отдельной страницей с Cancel и кнопкой Save; после сохранения вы возвращаетесь к пользователю.
Идентификаторы
| Поле | Правила |
|---|---|
| Необязателен. Уникален на всей платформе. | |
| Phone | Необязателен. Должен быть корректным номером в формате E.164, например +14155552671. Хранится в канонической форме E.164: записи, которые обозначают один номер (например, с национальным префиксом), превращаются в одно значение. Уникален на всей платформе. |
| Login | Необязателен. Уникален на всей платформе. |
Каждый идентификатор по отдельности необязателен, но для входа нужен хотя бы один, и редактор не сохранит пользователя ни с одним. Любой из них может начать процесс аутентификации. Если одно из значений уже есть у другого пользователя, редактор остается открытым и сообщает One of the identifiers is already taken by another user. Отправляются только измененные поля; очистка поля убирает этот идентификатор.
Роли
Карточка называется Roles in и выбранный тенант. Edit открывает роли этого тенанта списком флажков с описанием каждой роли. Отметьте роль, чтобы назначить ее, снимите отметку, чтобы убрать, и нажмите Save roles. См. Role.
Claims
Claims — это атрибуты профиля пользователя. Edit группирует их по scope, который их отдает, в выбранном тенанте. Флажок включает claim, снятие флажка удаляет его. email и phone_number показывают идентификаторы пользователя и правятся в Identifiers. Значения true и false, числа и JSON-массивы или объекты сохраняются как есть, все остальное — как строка. Какие claims получит клиент, зависит от выданных ему scope, см. Scope.
Устройства с входом

Versola узнает браузер или установку приложения по cookie — это user agent. Каждая строка карточки — один user agent, который auth еще помнит, с названием по браузеру и операционной системе (Chrome 130 on macOS 14.6) из заголовка User-Agent при входе, платформой и временем входа. У user agent в каждый момент не больше одной сессии; под ней карточка перечисляет клиентов, в которые заходили за эту сессию.
Под названием до трех строк показывают, как долго живет каждая часть:
| Строка | Значение |
|---|---|
| Session expires | Когда сессия закончится, что бы ни делал пользователь. Показывается, пока на устройстве есть вход. |
| Idle timeout | Показывается, только если у тенанта задан тайм-аут простоя: сессия заканчивается и тогда, когда пользователь до этого момента ничего не делает; активность сдвигает время вперед. |
| Device remembered until | Когда auth перестанет помнить этот user agent. Новый вход на нем сдвигает время вперед. Отдельного времени последней активности auth не хранит. |
| Столбец | Значение |
|---|---|
| Client | Название и ID клиента. |
| Entered | Когда пользователь зашел в этот клиент в этой сессии. |
| Access token until | До какого момента действует выданный для этого входа access token. |
| Метка | Offline access, если у клиента есть refresh token, выданный в этой сессии; стрелка рядом переходит к карточке Apps with access. |
Таблицы всех устройств используют одни и те же столбцы, поэтому даты выстраиваются друг под другом.
Когда сессия заканчивается, user agent остается в списке как устройство без входа под своим названием, с той же строкой Device remembered until, пока это время не истечет или вы не удалите устройство из памяти. Если refresh token, выданные в его сессиях, еще действуют, клиенты, которые их держат, перечислены под ним — так видно, почему приложение все еще работает. Refresh token называет только свою сессию, поэтому auth связывает его с устройством, лишь пока хранит завершенную сессию. Token, чьей сессии уже нет, показан в строке Signed-out device без названия и без кнопки Forget device: отзовите его в Apps with access.

| Кнопка | Что делает |
|---|---|
| Sign out device | Завершает сессию этого устройства, как собственный выход пользователя, и сообщает клиентам, в которые заходили с него, через back-channel logout. Устройство остается в списке как устройство без входа, offline-доступ не отзывается. Остальные устройства остаются с входом. |
| Forget device | После подтверждения убирает user agent из того, что помнит auth, завершает его сессию, если вход есть (клиентам сообщают через back-channel logout), и отзывает offline-доступ, выданный в его сессиях. Следующий вход в этом браузере или установке приложения начнется как новое устройство. Refresh token, чью завершенную сессию auth уже удалил, недоступны: отзовите их в Apps with access. |
| Sign out everywhere… | После подтверждения завершает все сессии на всех устройствах и отзывает offline-доступ всех приложений. Устройства остаются в списке как устройства без входа. |
| Refresh | Перечитывает устройства и offline-доступ. |
Приложения с доступом

Приложение с offline-доступом держит refresh token: оно получает новые access token для пользователя без устройства с входом, пока токен не истечет или не будет отозван. В карточке по строке на каждый refresh token.
| Столбец | Значение |
|---|---|
| Client | Название и ID клиента. |
| Scopes | Scope, для которых выдан токен. Метка DPoP-bound значит, что токен привязан к DPoP-ключу клиента (RFC 9449): воспользоваться его копией никто не сможет. |
| Issued, Expires | Когда токен выдан и когда перестает действовать. |
| Device | Устройство, где токен выдан, и состояние Signed in или Signed out. |
Revoke просит подтверждение и затем отзывает все refresh token этого клиента для пользователя. Клиент больше не получит новые access token, не отправив пользователя на вход заново. Пользователь остается с входом, а уже выданные access token истекают сами.
Passkey
Карточка перечисляет зарегистрированные passkey с названием, типом устройства (Multi-device или Single device), признаком Synced, транспортами и временем последнего использования и регистрации. Rename запрашивает новое название. Delete… просит подтверждение и удаляет passkey, после чего войти с ним нельзя.
Действия безопасности
Reset password задает временный пароль. См. Reset password. Reset limits сбрасывает счетчики ограничений пользователя и временную блокировку в выбранном тенанте; карточка подтверждает это надписью Limits reset. Для обоих нужен тенант.
Неизменяемое
User ID назначает auth при создании пользователя, он не меняется.
Удаление пользователя

Последняя карточка удаляет пользователя. Подтверждение называет пользователя и перечисляет последствия: его сессии завершаются, offline-доступ отзывается, passkey удаляются, клиентам сообщают через back-channel logout. Роли, claims, согласия и записи ограничений удаляются вместе с ним. Уже выданные access token действуют до истечения срока. Отменить удаление нельзя. После него вы возвращаетесь к поиску.
Reset password
Reset password открывает диалог и задает пользователю временный пароль.
| Поле | Значение |
|---|---|
| Temporary password lifetime (hours) | Целое число часов, не меньше 1. По умолчанию 12. |
| Deliver via | Email или SMS — только если у пользователя есть такой идентификатор, а в непродуктивных окружениях еще и Show — display it here. |
В production auth отправляет пароль выбранным способом и не показывает его. В непродуктивном окружении ничего не отправляется: выберите Show, и пароль один раз появится на экране с кнопкой Copy password. Если у пользователя нет ни email, ни телефона, а окружение — production, диалог не предлагает ни одного канала, и подтвердить его нельзя.
Когда пользователь входит с временным паролем, auth проводит остальные обязательные шаги и затем просит задать новый пароль. Просроченный временный пароль отклоняется. Кнопки для постоянного пароля в консоли нет. Для этого в Central API есть POST /users/password/set, в production он отвечает 404.
Первый вход и блокировка
Предустановленный администратор при первом входе в консоль использует временный пароль. Порядок такой: логин и временный пароль, одноразовый код, экран Set New Password, затем предложение Set up a Passkey, которое можно пропустить кнопкой Not now. Шаги для локального демо описаны в разделе Локальный запуск.
Повторные неудачные попытки блокируют вход. auth считает попытки по типам challenge, и с ограничениями по умолчанию у тенанта действуют такие окна:
| Challenge | Ограничения по умолчанию |
|---|---|
| Запрос одноразового кода | 2 за 60 с, 5 за 3600 с |
| Ввод одноразового кода | 3 за 120 с, 5 за 3600 с |
| Ввод пароля | 5 за 900 с, 10 за 3600 с |
| Passkey assertion | 5 за 300 с, 10 за 3600 с |
Превышение короткого окна замедляет пользователя: форма сообщает об ограничении, и можно повторить позже. Превышение самого длинного окна блокирует пользователя на banDurationSeconds, по умолчанию 1800 с, то есть на 30 минут. Во время блокировки вход показывает Access Denied, даже если код или пароль верны. Ограничения и срок блокировки задаются для каждого тенанта в карточке Submission limits страницы Security.
Чтобы снять блокировку раньше срока, другой администратор открывает пользователя и нажимает Reset limits. Если вы заблокировали единственного администратора, дождитесь конца блокировки.