Вход на сайте
OAuth, вход с устройства и соответствующие команды CLI.
Вход на сайте
Вход создаёт браузерную сессию в защищённой HttpOnly cookie. Провайдеры — Google и GitHub. Поля пароля и magic-link email нет.
Второй путь привязывает CLI-устройство к тому же аккаунту: CLI печатает код пользователя, вы одобряете его на сайте, CLI завершает.
URL и кто их видит
| Проекция | URL | Кому видно |
|---|---|---|
| Human | /{locale}/login | всем |
| Machine | /{locale}/ai/login | всем |
| Одобрение устройства | /{locale}/device-login | после входа, чтобы одобрить |
| Устройства (та же форма) | /{locale}/devices | после входа |
returnTo должен начинаться с /. Всё остальное игнорируется, и
посадка по умолчанию — /{locale}/account. Защищённые страницы
отправляют сюда с returnTo, равным пути, который они хотели.
reason=session_expired показывает Сессия истекла. Войдите
снова. status=error|cancel|conflict соответствует Ошибка входа,
Вход отменён или сообщению, что идентичность уже привязана.
/login может открыть кто угодно. /device-login без сессии
показывает Сначала войдите, затем подтвердите код устройства. и
кнопку назад ко входу, сохраняя user_code.
Для чего этот экран
Вход нужен, чтобы:
- начать OAuth Google или GitHub для браузера;
- восстановиться после истекшей cookie;
- скопировать команду входа CLI для устройства.
/device-login или Устройства нужны, чтобы ввести код,
который напечатал CLI. Онбординг — если аккаунт новый
и всё ещё onboarding_pending.
Вход не:
- сливает два существующих аккаунта (конфликт — отказ);
- создаёт локальную идентичность устройства (
device initтолько в CLI); - хранит токен провайдера в localStorage;
- входит в харнесс (сессии Claude Code / Codex / Grok Build не связаны).
Что на экране
| Элемент | Подпись | Эффект |
|---|---|---|
| Заголовок | Вход | — |
| Подзаголовок | Войдите через поддерживаемого провайдера. Сессия хранится в защищённой HttpOnly cookie. | — |
| Войти через Google | /v1/auth/google/login?client=web&return_to=… | |
| GitHub | Войти через GitHub | /v1/auth/github/login?client=web&return_to=… |
| Копия CLI | Войти с устройства через CLI | ai-stp task start --intent account --idempotency-key account-session-01 --json |
В mock/e2e кнопки POST в mock-действие вместо API. ?debug=1 с
моками добавляет дополнительные симуляторы ошибки/отмены. Этот гейт
не часть production.
OAuth — same-origin /v1/auth/… (в разработке переписывается на API).
Callback ставит session cookie. Step-up привязка второго
провайдера к существующему аккаунту — /v1/auth/link/{provider} из
Аккаунта, не эта страница.
Код устройства
Поля /device-login:
| Поле | Подпись |
|---|---|
| Код пользователя | Код пользователя |
| Отправка | Подтвердить устройство |
Ошибки: unknown (введите заново), expired (продолжите ту же account-задачу), resolved (уже использован), csrf (перезагрузите), failed (повторите). Успех: Устройство подтверждено — вернитесь в CLI; опрос должен завершиться.
Human / Machine: machine-вход — заголовок, подзаголовок, повседневный account start как блок кода и ссылка на каталог.
Соответствующие команды CLI
Повседневный вход — intent account:
ai-stp task start --intent account --idempotency-key account-session-01 --json
Expert leaves (auth login / complete / logout) — если незавершённый
device code уже есть:
ai-stp auth login --provider github --json
ai-stp auth login --provider google --json
ai-stp auth complete --json
ai-stp auth status --json
ai-stp auth logout --json
ai-stp link web --json
--provider обязателен и закрыт значениями github и google.
auth login начинает поток и печатает код для одобрения.
auth complete завершает, когда вы одобрили. auth status сообщает
local-only, authenticated, expired или revoked. auth logout
завершает облачную сессию и сохраняет локальные данные. link web
печатает канонический URL сайта.
Команды ai-stp auth device нет. Сайт копирует account start, не
выдуманный leaf. Следуйте CLI.
Идентичность устройства на машине отдельна:
ai-stp device init --json
ai-stp device show --json
device init не входит. auth login не создаёт устройство. Обычно
нужны оба, в этом порядке, на новой установке.
Тупики
| Что видно | Что это значит | Что делать |
|---|---|---|
| Ошибка входа | ошибка OAuth | повторите того же провайдера |
| Вход отменён | вы прервали у провайдера | повторите или выберите другого |
| Эта идентичность уже привязана к другому аккаунту | слияние отказано | используйте аккаунт, которому она уже принадлежит |
| Сессия истекла | устаревшая cookie | войти; returnTo сохранён |
| Нужен вход на device-login | нет браузерной сессии | войдите, код сохраняется |
| Неизвестный код | опечатка | введите заново; не добавляйте пробелы |
| Код истёк / уже использован | продолжите ту же account-задачу | ai-stp task start --intent account --idempotency-key account-session-01 --json |
| Отправили на онбординг | новый аккаунт | примите две редакции |
| Конфликт при привязке | этот Google/GitHub на другом аккаунте | сначала отвяжите там; слияния нет |
Никогда не кладите код пользователя в тикет, скриншот публичного issue или паспорт.
Связанные страницы
- Аккаунт — после успешного входа в браузере.
- Устройства — список плюс та же форма одобрения.
- Онбординг — первое правовое принятие.
- Главная — Войти с лендинга.
- Вход CLI — конверты тех же команд.
- Устройство — локальная идентичность.
- Быстрый старт для человека — локальная работа без аккаунта.
??? question "Нужен ли Вход, чтобы читать каталог?"
Нет. Анонимные чтения каталога работают в браузере и как
ai-stp registry search --json. Вход нужен для лайков, жалоб,
устройств, объектов, грантов и confirm публикации.