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

Не работает авторизация - причины по убыванию частоты

Вход не проходит, либо пользователя выкидывает обратно сразу после успешной авторизации.

Как проверить

Смотрим, что вообще думает платформа о текущем посетителе:

global $USER;
printf("авторизован=%s id=%s группы=%s\n",
$USER->IsAuthorized() ? 'да' : 'нет',
$USER->GetID() ?: '-',
implode(',', $USER->GetUserGroupArray()));
echo 'сессия: ', session_id() ?: 'нет', "\n";

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

Проверяем, как ставится кука авторизации:

Окно терминала
curl -si -X POST https://example.com/auth/ \
-d 'AUTH_FORM=Y&TYPE=AUTH&USER_LOGIN=test&USER_PASSWORD=secret' \
| grep -i 'set-cookie\|location'
# домен и путь в куке важнее её значения: по ним браузер решает, отправлять ли её

В ответе должны быть куки сессии и авторизации. Домен в них важнее всего: кука, поставленная на example.com, на shop.example.com не отправится, если домен не указан с точкой в начале.

Причины

  1. Кука авторизации ставится не на тот домен примерно 35% случаев

    ПризнакВход проходит, но на поддомене или после редиректа пользователь снова гость.

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

    Что делатьЗадаём общий домен кук в настройках модуля главного, с точкой в начале, и очищаем прежние куки.

  2. Сессия не сохраняется между запросами примерно 30% случаев

    ПризнакИдентификатор пользователя есть, а на следующей странице снова гость.

    ПроверкаПроверяем каталог сессий на запись, свободное место и настройки хранилища сессий PHP.

    Что делатьВозвращаем права на каталог сессий либо переводим хранилище в базу или в память.

  3. У группы нет доступа туда, куда идёт пользователь примерно 20% случаев

    ПризнакВход проходит, но целевая страница снова показывает форму авторизации.

    ПроверкаСмотрим группы пользователя и права этих групп на нужный раздел или модуль.

    Что делатьВыдаём право группе, а не человеку: доступ к панели управления выдаётся отдельно от прав на разделы.

  4. Форма закешировалась вместе со страницей примерно 15% случаев

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

    ПроверкаПроверяем, попадает ли блок с формой в кеш компонента или в композитный кеш страницы.

    Что делатьВыносим форму из кешируемой области либо помечаем блок как динамический для композита.

Если ничего не помогло

Смотрим журнал событий: неудачные входы платформа пишет туда сама.

$events = CEventLog::GetList(['ID' => 'DESC'], ['AUDIT_TYPE_ID' => 'USER_LOGIN']);
while ($event = $events->GetNext()) {
printf("%s %s %s\n", $event['TIMESTAMP_X'], $event['REMOTE_ADDR'], $event['DESCRIPTION']);
}

Смотрим группы пользователя и его права на нужный раздел:

$user = CUser::GetByID($userId)->Fetch();
$groups = CUser::GetUserGroup($userId);
printf("%s активен=%s группы=%s\n", $user['LOGIN'], $user['ACTIVE'], implode(',', $groups));
// право на раздел структуры сайта считается отдельно от прав на модули
echo 'право на /personal/: ', $APPLICATION->GetFileAccessPermission('/personal/'), "\n";
# вход через каталог предприятия разбирают отдельно, там свои причины

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

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

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

Почему авторизация не работает на поддомене?

Кука авторизации по умолчанию ставится на конкретный домен. Чтобы она действовала на всех поддоменах, в настройках модуля указывают общий домен с точкой в начале, и старые куки после этого надо очистить.

Вход есть, а в админку не пускает.

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

AJAX-авторизация сломалась после обновления.

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

Как понять, отклонён вход по паролю или по правам?

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

Смежное

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