Перейти к содержимому

Вход через соцсеть не работает - причины по убыванию частоты

Кнопка провайдера не появилась в форме входа, либо сервис возвращает посетителя с меткой ошибки в адресе, либо вход проходит, а учётная запись на сайте так и не создаётся. Разбираем причины в порядке убывания частоты.

С чего начать

Клик по кнопке даёт три исхода, и каждый уводит в свою половину списка причин. Страница провайдера не открылась - смотрим окружение и настройки модуля. Вернул с меткой ошибки - смотрим приложение. Вернул молча, а гость остался гостем - смотрим создание пользователя.

Проверяем окружение до всех настроек:

Окно терминала
php -m | grep -i openssl # без библиотеки шифрования обмен ключами не начнётся
curl -sI https://example.org/ | head -n 1 # сайт обязан отвечать по защищённому протоколу
curl -sI http://example.org/ | grep -i location # и уводить на него простой адрес тоже обязан
# проверять вход удобнее в приватном окне: в своей сессии половина отказов не видна

Модуль соцсервисов работает только по защищённому протоколу и требует openssl в сборке PHP. Пустой вывод первой команды означает, что вход не запустится ни у одного провайдера.

Смотрим, доступен ли обработчик возврата снаружи:

Окно терминала
curl -sI 'https://example.org/bitrix/tools/oauth/vkontakte.php' | head -n 1
# фиксированный обработчик ВКонтакте: провайдер зовёт его сам, без куки и авторизации
# ответ 200 или 302 - нормально, а 403 и 404 означают, что возврату некуда прийти

У ВКонтакте адрес возврата фиксирован, у остальных он берётся из настроек модуля и оттуда же копируется. Придуманный руками адрес даёт отказ уже после согласия посетителя, когда причина совсем не очевидна.

Читаем адрес, на который вернул провайдер:

https://example.org/bitrix/tools/oauth/vkontakte.php?auth_service_id=VKontakte&auth_service_error=1
# метка auth_service_error=1 означает отказ провайдера или обрыв обмена ключами
# ключи и адреса возврата всех сервисов: /bitrix/admin/settings.php?lang=ru&mid=socialservices

Метка ошибки в адресе отделяет отказ провайдера от поломки на самом сайте. Белый экран вместо возврата читается так же: разбирать надо приложение, а не шаблон формы входа.

Сверяем версии модулей платформы:

Окно терминала
grep -m1 VERSION /home/bitrix/www/bitrix/modules/socialservices/install/version.php
grep -m1 VERSION /home/bitrix/www/bitrix/modules/main/install/version.php
# версия модуля лежит в массиве $arModuleVersion рядом с датой сборки
# для входа через Битрикс24.Network нужен main от 25.100.500 и socialservices от 24.100.100

Провайдеры меняют свой протокол в одностороннем порядке, и старый модуль перестаёт понимать ответ. Правка файла провайдера прямо в ядре снимает симптом ровно до ближайшего обновления платформы.

Ищем обязательные поля пользователя:

$rows = \Bitrix\Main\UserFieldTable::getList([
'select' => ['FIELD_NAME', 'MANDATORY'],
'filter' => ['=ENTITY_ID' => 'USER', '=MANDATORY' => 'Y'],
])->fetchAll();
print_r(array_column($rows, 'FIELD_NAME'));
// такое поле обязано заполниться при первом входе, иначе запись не создастся

Обязательное пользовательское поле блокирует создание записи при первом входе. Провайдер его не отдаёт, вход завершается молча, и посетитель остаётся прежним гостем.

Причины

  1. Адрес возврата приложения не совпадает с адресом сайта примерно 30% случаев

    ПризнакПровайдер показывает отказ сразу после согласия и жалуется на несовпадение адреса возврата.

    ПроверкаСверяем адрес из настроек модуля с полем приложения посимвольно, вместе с протоколом и поддоменом.

    Что делатьКопируем адрес обратного вызова из интерфейса модуля и вписываем его в приложение без правок.

  2. Нет защищённого протокола или библиотеки шифрования примерно 20% случаев

    ПризнакКнопка нажимается, страница провайдера не открывается, а в журнале сервера пусто.

    ПроверкаСмотрим, открывается ли сайт по защищённому протоколу и есть ли openssl среди расширений PHP.

    Что делатьВыпускаем сертификат, переводим сайт целиком на защищённый протокол и включаем openssl в сборке.

  3. Ключи приложения или запрошенные доступы не те примерно 16% случаев

    ПризнакНа тестовом сайте вход работает, а на боевом провайдер возвращает отказ.

    ПроверкаСверяем идентификатор и секрет с кабинетом провайдера и смотрим список выданных приложению доступов.

    Что делатьПереносим ключи боевого приложения в блок нужного провайдера и добавляем доступы к почте и имени.

  4. Устаревший модуль не понимает новый протокол провайдера примерно 15% случаев

    ПризнакВозврат приходит с меткой auth_service_error, хотя вчера тот же вход работал.

    ПроверкаСмотрим версии главного модуля и соцсервисов, а следом историю обновлений платформы.

    Что делатьОбновляем платформу целиком: правка кода провайдера в ядре держится до ближайшего обновления.

  5. Провайдер закрыл выдачу приложений или сменил экраны примерно 11% случаев

    ПризнакНовое приложение в кабинете сервиса завести не получается, а старое отвечает отказом.

    ПроверкаОткрываем кабинет разработчика провайдера и ищем там раздел создания новых приложений.

    Что делатьПереносим вход на живой сервис, а кнопку закрытого убираем из формы авторизации.

  6. Переход теряет параметры на правилах перенаправления примерно 8% случаев

    ПризнакОшибка вылезает только на поддомене или сразу после переезда сайта на защищённый протокол.

    ПроверкаПроходим цепочку перенаправлений и смотрим, доживают ли параметры запроса до обработчика возврата.

    Что делатьПравим правила так, чтобы строка запроса уходила дальше без перекодировки и без обрезки.

Частые вопросы

Перестала работать авторизация через соцсети, что делать?

Начинать с обновления платформы: сервисы меняют свой протокол в одностороннем порядке, и старый модуль перестаёт понимать ответ. Правка файла провайдера в ядре живёт до ближайшего обновления, после чего симптом возвращается.

Что означает auth_service_error=1 в адресе?

Обмен с провайдером оборвался: не совпал адрес возврата, не подошли ключи либо сервис отказал в доступе. Разбор начинают со сверки адреса возврата и ключей приложения, а не с шаблона формы входа.

Почему ошибка появляется только на поддомене?

Приложение зарегистрировано на основной домен, а возврат приходит с другого адреса. У части провайдеров настройка распространяется на поддомены, у части - нет, и тогда для поддомена заводят отдельное приложение.

Кнопки провайдеров не выводятся, куда смотреть?

В настройки модуля соцсервисов: кнопка появляется только у включённого провайдера с заполненными ключами. Пустой список сервисов означает именно это, а не ошибку вёрстки шаблона.

Можно ли завести новое приложение в Одноклассниках?

Нет, создание пользовательских приложений там больше не поддерживается. Для новых подключений ориентируются на инструкцию по ВКонтакте, а кнопку закрытого сервиса убирают из формы входа.

Смежное

Первоисточник