Files
please-pay-me/context/2026-09-20_02-00-00_yandex-login.md
T
2026-09-21 04:06:43 +03:00

38 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-09-20 — Вход через Яндекс ID (web + mobile)
## Запрос
Кнопка «Войти через Яндекс» в кабинете и в приложении. Client ID / secret
уже заведены в Yandex OAuth.
## Решение
Authorization code. Secret только на API (`YANDEX_CLIENT_SECRET` в `.env`,
не в web/mobile и не в git). Клиенты получают `client_id` с
`GET /api/auth/providers` и шлют `code` + `redirect_uri` в
`POST /api/auth/yandex`.
API меняет код на токен Яндекса (`oauth.yandex.ru/token`), читает профиль
(`login.yandex.ru/info`) и выдаёт тот же JWT, что и Telegram.
`users.user_id` для Яндекса: ` (1 << 50) | yandexId ` — не пересекается с
Telegram id и остаётся внутри `Number.MAX_SAFE_INTEGER`, чтобы JSON в
браузере и Flutter не терял точность.
`redirect_uri` сверяется с allowlist (продакшен `https://please-pay-me.ru/`,
localhost:51290 и :5173, плюс `YANDEX_REDIRECT_URI` / `YANDEX_REDIRECT_URIS`).
## Потоки
- Web: кнопка → `oauth.yandex.ru/authorize` → возврат на `/?code=`
(как в кабинете Яндекса) → `RequireAuth` переносит query на `/login`
`loginWithYandex``setSession`.
- Mobile: своя кнопка → WebView на Яндекс → перехват `{кабинет}/?code=`
`POST /api/auth/yandex` из Flutter.
## Что нужно в консоли Яндекса
Redirect URI: `https://please-pay-me.ru/` — как зарегистрировано в Яндексе.
## Секрет
Значения записаны в корневой `.env` (gitignore). В репозиторий не коммитятся.
Секрет светился в чате — если репозиторий общий, лучше перевыпустить в
кабинете Яндекса.