← Назад к решениям
ПлагинPHPПлатно

WP Social Auth

Плагин WordPress, добавляющий вход через VK, Яндекс, Steam и Discord в формы WordPress и WooCommerce. Единый контракт провайдера, проверка OpenID 2.0 для Steam, таблица-замок против дублирующих колбэков и форма дозаполнения для провайдеров без email.

WP Social Auth

Стек

PHPWordPressWooCommerceOAuthOpenIDMySQL

Проблема

Магазин игр требовал регистрации перед оформлением заказа. У аудитории уже были аккаунты в VK, Яндексе, Steam и Discord и не было ни малейшего желания придумывать ещё один пароль - часть сессий оформления заканчивалась ровно на форме регистрации. Готовые плагины соцвхода закрывали VK и Яндекс, но не Steam, который вообще не работает по OAuth.

Вторая, менее заметная проблема вылезла уже на бою: колбэк OAuth иногда срабатывал дважды на один вход - двойное нажатие, повтор запроса, предзагрузка в браузере - и каждый проход создавал свой аккаунт. Поддержка вручную склеивала дубли клиентов.

До → После

ДоПосле
Форма регистрации с паролем как единственный входЧетыре провайдера в один клик рядом с обычной формой
Steam невозможен: у него OpenID 2.0, а не OAuthSteam проверяется сверкой подписи на сервере Valve
Дубли аккаунтов, когда колбэк приходил дваждыКод занимается в таблице-замке: второй запрос идёт за первым
Добавить провайдера - значит форкнуть весь сценарий входаПровайдер - это клиент, сервис, маппер пользователя и вкладка настроек
У пользователей Steam не было email: заказ не оформитьНедостающие контакты собираются отдельной формой после входа
Вход то по логину, то по email, без единого правилаВход только по email, правило домена: на всех точках входа
После входа кэш отдавал шапку неавторизованного гостяПриватный кэш страниц сбрасывается прямо в обработчике входа

Как это работает

  1. Покупатель выбирает провайдера. Кнопки подставляются в формы входа и регистрации WordPress и в обе формы WooCommerce, поэтому одни и те же четыре варианта видны везде, где вообще происходит вход.
  2. Провайдер возвращает ответ. OAuth-провайдеры отдают код, который меняется на access-токен и профиль. Steam вместо этого возвращает подписанное утверждение OpenID, и оно отправляется обратно в Valve наcheck_authentication - до вердикта не доверяем ничему.
  3. Код занимается. До любых действий с аккаунтом колбэк пишет код в таблицу-замок со счётчиком обращений. Дублирующий колбэк видит строку занятой, дожидается первого запроса и переиспользует его результат: один вход - один аккаунт, что бы ни делал браузер.
  4. Аккаунт находится или создаётся. Существующий клиент ищется по email, а если провайдер email не отдал - по логину. Новый пользователь WordPress создаётся только при честном промахе.
  5. Собираются недостающие данные. Steam не отдаёт адрес почты, поэтому такие пользователи отправляются на форму с email и телефоном и только потом попадают в оформление заказа. Остальные идут сразу на настроенную страницу.
  6. Сессия открывается начисто. Ставятся куки авторизации, срабатывает штатное событие входа, чтобы его увидели другие плагины, и сбрасывается приватный кэш, так что посетитель сразу видит страницу авторизованного.

Основные возможности

  • VK, Яндекс, Steam и Discord за одним интерфейсом провайдера
  • Проверка подписи OpenID 2.0 для Steam, обмен OAuth-кода для остальных
  • Колбэки, устойчивые к гонке, таблица-замок не даёт создать дубль
  • Форма дозаполнения данных для провайдеров, не отдающих email
  • Вход только по email с настраиваемым ограничением домена
  • Отдельный экран настроек и независимый переключатель на каждого провайдера
  • Сброс приватного кэша страниц при входе (с поддержкой LiteSpeed)
  • Записанные ответы провайдеров в тестах - весь сценарий проверяется без сети

Установка

  1. Загрузите папку плагина в /wp-content/plugins/ и активируйте
  2. Прогоните встроенную миграцию, создающую таблицу-замок для кодов авторизации
  3. Откройте Awesome Auth в боковом меню админки и заполните client id и секрет для каждого нужного провайдера
  4. Задайте URL успешного редиректа и страницу с формой дозаполнения в общих настройках
  5. Пропишите redirect URI, показанный на вкладке провайдера, в консоли разработчика этой сети

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок