Почему не устанавливаются куки BITRIX_SM_... при авторизации?
Добрый день.
Делаю авторизацию на сайте BITRIX. Точнее, копирую готовый функционал с другого сайта (на другом хостинге), правда, там старая версия BITRIX и php 5.6, а тут последняя (пока без лицензии) и php 7.4.
В общем, авторизация работает, но не продлевается, даже при включённых настройках "Разрешить запоминание авторизации", "Использовать защищенное хранение авторизации в cookies", "Распространять авторизацию на все домены".
Для авторизации используется кастомный функционал, который авторизует по проверочному коду, высылаемому в SMS. Т.е. человек указал свой номер телефона, битрикс проверяет наличие пользователя с этим номером и высылает смс с кодом для подтверждения. После ввода корректного кода срабатывает функция: CUser::Authorize($ID,true)
Обращаю внимание, что второй параметр установлен на true и по идее он отвечает за включение сохранения авторизации. Но этого не происходит.
Пробовал заменить эту функцию и вручную авторизовать пользователя по CUSER::Login($LOGIN,$PASSWORD,"Y") - третий параметр которой так же отвечает за сохранение авторизации, но эффекта тоже нуль.
Обратил внимание, что при авторизации не устанавливаются cookie из серии BITRIX_SM_........., в частности, BITRIX_SM_LOGIN, BITRIX_SM_UIDH - которые, как раз за это и отвечают. Однако, бесполезная BITRIX_SM_SOUND_LOGIN_PLAYED устанавливается. Что очень странно.
Возможно, кто-нибудь сталкивался с этой ситуацией? Подскажите, куда копать? Я склоняюсь к мысли, что, вероятно, настройки php/сервера мешают сохранять нужные cookies.
Какая именно версия битрикса?
Авторизация происходит аякс-запросом? Если да - то как возвращаете ответ от сервера?
В последних версиях (19.0-20.5) поменяли работу с куками, и в принципе сильно поменяли процесс обработки запроса.
Чтобы выставленные через битрикс куки отправились, попробуйте после вашего header перед умиранием добавить код:
\Bitrix\Main\Context::getCurrent()->getResponse()->writeHeaders();
1С-Битрикс: Управление сайтом 20.5.393
Авторизация без AJAX-а. Форма с кодом, полученным по смс, отправляется этому же скрипту. Он проверяет наличие переменной кода в $_POST, если она есть и код верный, вызывает $USER->Authorize . Далее идёт header("Location: ............") на нужную страницу, в зависимости от роли авторизованного пользователя. Повторюсь, точно такой же процесс работает на старой версии сайта, работающей на bitrix 14 версии (вроде)
Александр Цымбал, в последних версиях (19.0-20.5) поменяли работу с куками, и в принципе сильно поменяли процесс обработки запроса.
Чтобы выставленные через битрикс куки отправились, попробуйте после вашего header перед умиранием добавить код:
\Bitrix\Main\Context::getCurrent()->getResponse()->writeHeaders();
Александр Цымбал, когда это изменение выкатили - сам на него напоролся. В доках ничего не было, копал исходники как битрикс запрос обрабатывает. После этого в доках это и не искал.
Более того в 20.5 эта штука опять поменялась. В 19.0-20.0 был такой код:
Context::getCurrent()->getResponse()->flush('');
С 20.5 пришлось ставить то, что я вам скинул.
Добрый день. Можно более подробно раскрыть что значит "перед умиранием" )) обновился битрикс и сейчас некоторые пользователи испытывают проблемы при авторизации до тех пор пока не сбросят в локальном браузере данные. Часть пользователей нормально работает, часть косячно. Поможет ли вставка \Bitrix\Main\Context::getCurrent()->getResponse()->writeHeaders();