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

Стек
Проблема
Магазин игр требовал регистрации перед оформлением заказа. У аудитории уже были аккаунты в VK, Яндексе, Steam и Discord и не было ни малейшего желания придумывать ещё один пароль - часть сессий оформления заканчивалась ровно на форме регистрации. Готовые плагины соцвхода закрывали VK и Яндекс, но не Steam, который вообще не работает по OAuth.
Вторая, менее заметная проблема вылезла уже на бою: колбэк OAuth иногда срабатывал дважды на один вход - двойное нажатие, повтор запроса, предзагрузка в браузере - и каждый проход создавал свой аккаунт. Поддержка вручную склеивала дубли клиентов.
До → После
| До | После |
|---|---|
| Форма регистрации с паролем как единственный вход | Четыре провайдера в один клик рядом с обычной формой |
| Steam невозможен: у него OpenID 2.0, а не OAuth | Steam проверяется сверкой подписи на сервере Valve |
| Дубли аккаунтов, когда колбэк приходил дважды | Код занимается в таблице-замке: второй запрос идёт за первым |
| Добавить провайдера - значит форкнуть весь сценарий входа | Провайдер - это клиент, сервис, маппер пользователя и вкладка настроек |
| У пользователей Steam не было email: заказ не оформить | Недостающие контакты собираются отдельной формой после входа |
| Вход то по логину, то по email, без единого правила | Вход только по email, правило домена: на всех точках входа |
| После входа кэш отдавал шапку неавторизованного гостя | Приватный кэш страниц сбрасывается прямо в обработчике входа |
Как это работает
- Покупатель выбирает провайдера. Кнопки подставляются в формы входа и регистрации WordPress и в обе формы WooCommerce, поэтому одни и те же четыре варианта видны везде, где вообще происходит вход.
- Провайдер возвращает ответ. OAuth-провайдеры отдают код, который меняется на access-токен и профиль. Steam вместо этого возвращает подписанное утверждение OpenID, и оно отправляется обратно в Valve на
check_authentication- до вердикта не доверяем ничему. - Код занимается. До любых действий с аккаунтом колбэк пишет код в таблицу-замок со счётчиком обращений. Дублирующий колбэк видит строку занятой, дожидается первого запроса и переиспользует его результат: один вход - один аккаунт, что бы ни делал браузер.
- Аккаунт находится или создаётся. Существующий клиент ищется по email, а если провайдер email не отдал - по логину. Новый пользователь WordPress создаётся только при честном промахе.
- Собираются недостающие данные. Steam не отдаёт адрес почты, поэтому такие пользователи отправляются на форму с email и телефоном и только потом попадают в оформление заказа. Остальные идут сразу на настроенную страницу.
- Сессия открывается начисто. Ставятся куки авторизации, срабатывает штатное событие входа, чтобы его увидели другие плагины, и сбрасывается приватный кэш, так что посетитель сразу видит страницу авторизованного.
Основные возможности
- VK, Яндекс, Steam и Discord за одним интерфейсом провайдера
- Проверка подписи OpenID 2.0 для Steam, обмен OAuth-кода для остальных
- Колбэки, устойчивые к гонке, таблица-замок не даёт создать дубль
- Форма дозаполнения данных для провайдеров, не отдающих email
- Вход только по email с настраиваемым ограничением домена
- Отдельный экран настроек и независимый переключатель на каждого провайдера
- Сброс приватного кэша страниц при входе (с поддержкой LiteSpeed)
- Записанные ответы провайдеров в тестах - весь сценарий проверяется без сети
Установка
- Загрузите папку плагина в
/wp-content/plugins/и активируйте - Прогоните встроенную миграцию, создающую таблицу-замок для кодов авторизации
- Откройте Awesome Auth в боковом меню админки и заполните client id и секрет для каждого нужного провайдера
- Задайте URL успешного редиректа и страницу с формой дозаполнения в общих настройках
- Пропишите redirect URI, показанный на вкладке провайдера, в консоли разработчика этой сети
Открыт для работы по контракту
Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.
Записаться на 30-минутный звонок