Браузер: Firefox 83.0 (64-разрядная)
SSO работает корректно в Chrome с использованием PHP-скрипта, найденного на этом форуме, но в Firefox перед &sig добавляется ==. Кто-нибудь знает, что может быть причиной этого?
session/sso_provider?sso=bm9uY2U9MmE4YmE2NmE0ZmRmYjRlM2JmNGJmMDkzNTliZjg3MWVlZDhkMTIzNTRiMzc4OGQyNTAwYzY3NjBiZjEwNWMyNmYzMTUxNmE4NTc0NDdjNzE0YmRkYTM4MTljMmFjOTA5NmY0MDkyNWQ5NWIwOTFkMDVmM2QzZDIyZDhmYTdiMzYmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ2Y2VsaXF1aWRyZWNpcGVzLmNvbSUyRmNvbnRyb2xsZXJzJTJGbG9naW5Db250cm9sLnBocA==&sig=261ee2477e94edcbcc1513e248091860445ed2c2cc8f30835a1fd061ff0
simon
09.Декабрь.2020 16:50:46
2
Vaping_Community:
SSO работает нормально в Chrome с использованием PHP-скрипта, найденного на этом форуме, но в Firefox перед &sig добавляется ==. Кто-нибудь знает, что может быть причиной этого?
Можете поделиться ссылкой на PHP-скрипт, который вы используете?
michaeld
(Michael - Communiteq)
09.Декабрь.2020 17:11:12
3
Это часть строки, закодированной в base64. Перед отправкой клиенту вам следует применить urlencode(). Вы это делаете? Можете поделиться своим кодом?
Код представлен ниже, спасибо заранее
Я модифицировал это: Discourse sso provider login · GitHub
Ссылка на сайт, использующий этот код, где возникает проблема в Firefox: https://vceliquidrecipes.com/
ФОРМА ВХОДА
<div class="row mt-1">
<div class="col-md-12 d-flex justify-content-center">
<p><a class="btn btn-success" href="'.$discourse_url.'/session/sso_provider?'.$query.'" role="button">Войти</a> <a class="btn btn-success" href="https://vapingcommunity.co.uk/signup" role="button">Регистрация</a></p>
</div>
</div>
$sso_secret = 'ITSASECRET';
$discourse_url = 'https://vapingcommunity.co.uk';
$nonce = hash('sha512', mt_rand());
$_SESSION['nonce'] = $nonce;
$payload = base64_encode( http_build_query( array (
'nonce' => $nonce,
'return_sso_url' => $me
)
) );
$request = array(
'sso' => $payload,
'sig' => hash_hmac('sha256', $payload, $sso_secret )
);
$query = http_build_query($request);
if(!empty($_GET) and isset($_GET['sso'])){
$sso_secret = 'ITSASECRET';
if(isset($_SESSION['loggedin']) && isset($_SESSION['username']) && $_SESSION['loggedin'] == true){
header("location: /");
die();
}
$sso = $_GET['sso'];
$sig = $_GET['sig'];
if(hash_hmac('sha256', urldecode($sso), $sso_secret) !== $sig){
header("HTTP/1.1 404 Not Found");
die();
}
В моём контроллере
$sso = urldecode($sso);
$query = array();
parse_str(base64_decode($sso), $query);
$username = $query['username'];
$useremail = $query['email'];
if(!empty($query['avatar_url'])) {
$avatar_url = $query['avatar_url'];
}
else {
$avatar_url = $miscf->fullURL().'/images/defaultAvatar.png';
}
$userisadmin = $query['admin'];
$userismoderator = $query['moderator'];
$usergroup = $query['groups'];
$externalid = $query['external_id'];
if ($userf->checkUserEIDExists($externalid) == false) {
$userf->addUser($username,$useremail,$avatar_url,$userisadmin,$userismoderator,$usergroup,$externalid);
}
$nonce = $_SESSION['nonce'];
if($query['nonce'] != $nonce){
header("HTTP/1.1 404 Not Found");
die();
}
$userf->loginUser($query['username'],$query['external_id'],$avatar_url,$query['groups']);
Функция входа:
*УСТАНАВЛИВАЕТ COOKIE, ВЫПОЛНЯЕТ ДРУГИЕ ВСПОМОГАТЕЛЬНЫЕ ДЕЙСТВИЯ, ТАКИЕ КАК ПРОВЕРКА ПОЛЬЗОВАТЕЛЯ*
*ЗАКАНЧИВАЕТСЯ ЭТИМ*
if(isset($_SESSION['url']))
$url = $_SESSION['url'];
else
$url = "";
$miscf = new miscf();
$fullurl = $miscf->fullURL().$url;
header("Location:".$fullurl);
unset($_SESSION['url']);
die();
michaeld
(Michael - Communiteq)
09.Декабрь.2020 19:35:10
5
Окей, всё выглядит хорошо. И как именно это вызывает проблему? Поскольку я думаю, что это всё равно должно работать..
Что ж, я рад, что вы спросили. Похоже, вход проходит успешно, но при возвращении на сайт меню пользователя не отображается — под ссылкой «Пользователь» снова появляется кнопка входа.
Я начинаю подозревать, что проблема связана с куки-файлами, ведь в Chrome всё работает нормально. Создается впечатление, что проверка «авторизованного состояния» игнорируется при первоначальной загрузке страницы: после обновления все элементы навигации для авторизованного пользователя отображаются корректно. Хочу подчеркнуть, что эта проблема возникает только в Firefox.
michaeld
(Michael - Communiteq)
09.Декабрь.2020 19:42:57
7
Хм, это действительно очень странно.
Однако, я думаю, что это не связано с тем, что == не отображается в URL-кодированном виде. Так что, возможно, вы идёте не по тому пути.
Я буду продолжать попытки, пока не исправлю это, и сообщу вам, когда это сделаю. Спасибо за вашу помощь