Один клик вместо шести цифр
Пятый раз за день открываю Planq. Ввожу email. Жду код. Копирую шесть цифр. Вхожу. Через час снова. Email, код, шесть цифр. OTP работает. Но тридцать цифр в день это не вход, это ритуал.

Зачем усложнять
Google OAuth звучит как полдня на интеграцию. Firebase SDK, authlib, новые таблицы, миграции. Но если остановиться и подумать что реально нужно - нужен email пользователя. Google его отдаёт. Email уже есть в системе. OTP и Google это два разных способа доказать что ты владелец этого email. Та же функция, другой вход.
Два роута на бэкенде. Первый генерирует state, кладёт в cookie, редиректит на Google. Второй принимает callback, получает email, вызывает тот же _authenticate_user() что и OTP. Никаких новых зависимостей. httpx уже стоял. Три HTTP-запроса вместо одной библиотеки на двенадцать тысяч строк.
На фронте одна ссылка. <a href="/auth/google">. Никакого JS SDK. Разделитель «или» между кнопкой и OTP-формой. Нажал, выбрал аккаунт, внутри.
Мобилка
На вебе всё просто - cookies. На Android cookies из браузера не вернутся в приложение. Нужен другой механизм.
Один параметр ?platform=mobile в запросе. Бэкенд запоминает его в state. После авторизации вместо cookies и редиректа на фронт отправляет deep link: planq://auth/callback с токенами в query. Приложение перехватывает, сохраняет, пускает внутрь. Тот же бэкенд, тот же поток, одно ветвление в конце.
Сломался билд. Новые AndroidX-зависимости потребовали Gradle посвежее. Поднял версию, собралось.
Что не делал
Не ставил библиотеку ради одного провайдера. Не парсил ID Token - зачем, если после server-side exchange можно просто спросить userinfo API. Не трогал схему базы данных. Не добавлял UI привязки аккаунтов. Один email, один юзер, два способа войти.
OTP остался. Для тех у кого корпоративный Google с ограничениями. Для мобилки без Play Services. Как запасной вход.
Но основной путь теперь один клик. Тридцать цифр в день превратились в ноль.
Читайте также


