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

Страница и форма авторизации - компоненты, шаблоны, возврат после входа

Ставим форму входа в шапку, собираем страницу авторизации и разбираемся, куда возвращать пользователя после входа.

Решение

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

$APPLICATION->IncludeComponent('bitrix:system.auth.form', 'header', [
'REGISTER_URL' => '/auth/registration/',
'FORGOT_PASSWORD_URL' => '/auth/forgot-password/',
'PROFILE_URL' => '/personal/', // куда ведёт ссылка после входа
'SHOW_ERRORS' => 'Y', // без этого сообщения формы теряются
]);

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

Собираем страницу авторизации целиком:

$APPLICATION->IncludeComponent('bitrix:system.auth.authorize', '', [
'REGISTER_URL' => '/auth/registration/',
'FORGOT_PASSWORD_URL' => '/auth/forgot-password/',
]);

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

Авторизуем из кода:

global $USER;
$result = $USER->Login($login, $password, 'Y'); // третий аргумент - запомнить
if ($result !== true) {
echo $result['MESSAGE']; // при ошибке возвращается массив, а не false
}

Метод возвращает true при успехе и массив с сообщением при отказе. Проверка через if (!$result) работать не будет: непустой массив истинен.

Возвращаем пользователя туда, откуда он пришёл:

// в форме передаётся адрес возврата, компонент подставит его после входа
$backurl = htmlspecialcharsbx($APPLICATION->GetCurPageParam('', ['login']));
echo '<input type="hidden" name="backurl" value="' . $backurl . '">';

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

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

Проверяем, авторизован ли посетитель, перед отрисовкой формы:

global $USER;
if ($USER->IsAuthorized()) {
echo 'Здравствуйте, ', htmlspecialcharsbx($USER->GetFullName());
} else {
$APPLICATION->IncludeComponent('bitrix:system.auth.form', 'header', []);
}

Компонент формы сам определяет состояние, но своя ветка нужна, когда вместо формы надо показать меню профиля, а не приветствие. Имя пользователя при выводе экранируют: оно приходит из профиля и правится самим человеком.

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

Типичные проблемы

Форма показывается, но вход не срабатывает.

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

После входа пользователя возвращает на страницу авторизации.

Не передан адрес возврата. Компонент не помнит, откуда пришёл человек, если этого не сказать явно скрытым полем формы.

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

Результат сравнивается как булево. При ошибке метод возвращает массив с сообщением, а непустой массив в условии истинен.

Смена логотипа на странице входа не применяется.

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

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

Чем system.auth.form отличается от system.auth.authorize?

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

Как сделать вход по AJAX?

Отправлять данные формы на текущий адрес запросом и перерисовывать нужный блок ответом. Отдельного API входа нет, обрабатывает запрос тот же компонент, что и при обычной отправке.

Можно ли пускать по email вместо логина?

Да, это настройка модуля: вход по email разрешается отдельным флагом. Логин при этом остаётся, просто перестаёт быть единственным способом представиться.

Как обновить страницу после входа?

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

Смежное

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