#php #cookies #single-sign-on #mediawiki
#php #файлы cookie #единый вход #mediawiki
Вопрос:
Я пытаюсь настроить очень простой процесс единого входа между основным сайтом и сайтом mediawiki, оба из которых находятся в одном домене, используя файлы cookie.
В следующем примере сайты «example.org/main «, и «example.org/wiki «. Пользователи будут входить только в «/ main». Во время входа в «/ main» будет вызван php-скрипт, который получает токен из «/ wiki» и создает набор из 3 файлов cookie. С этого момента (пока сеанс не истечет) пользователь должен иметь возможность доступа к обоим сайтам без дальнейших логинов. Предполагается (по крайней мере, на данный момент), что учетные данные синхронизированы между сайтами, и эта синхронизация будет управляться вручную.
Я попробовал следующий скрипт:
<?php
//create a cookie file
$cookie_jar = tempnam('/volume1/web/cookies','cookie');
//query the wiki site to get a token
$c = curl_init('http://example.org/wiki/api.php?action=queryamp;meta=tokensamp;type=loginamp;format=json');
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_jar);
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie_jar);
$page = curl_exec($c);
//parse the token from the query response:
$logintoken_array = json_decode($page);
$logintoken = $logintoken_array->query->tokens->logintoken;
echo $logintoken;
//which returns a token value like:
//"9f14c477d696fb9e63ecf5e336b071545f8f60ac \"
//perform action=clientlogin to log into /wiki
$post = [
'action' => 'clientlogin',
'password' => 'secret',
'username' => 'dennis',
'logintoken' => $logintoken,
'loginreturnurl' => 'http://example.org'
];
$c = curl_init('http://example.org/wiki/api.php');
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_jar);
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie_jar);
$page = curl_exec($c);
curl_close($c);
echo $page;
//this returns
//{ "clientlogin": { "status": "PASS", "username": "Dennis" }}
//then write cookies to persist the session in the browser
$cookie_name = "test__session";
$cookie_value = $logintoken;
setcookie($cookie_name, $cookie_value, time() (86400 * 30), "/");
$cookie_name = "test_wiki_UserID";
$cookie_value = "3";
setcookie($cookie_name, $cookie_value, time() (86400 * 30), "/");
$cookie_name = "test_wiki_UserName";
$cookie_value = "dennis";
setcookie($cookie_name, $cookie_value, time() (86400 * 30), "/");
?>
Результирующие файлы cookie теперь видны в списке файлов cookie инструмента разработчика браузера и идентичны 3 файлам cookie, которые создаются при непосредственном входе в систему вручную mysite.org/wiki используя одно и то же имя пользователя (за исключением того, что у него другое значение токена).
Однако, когда я в том же браузере (на той же вкладке или на другой вкладке) пытаюсь получить доступ к вики-странице, на вики-странице отображается «не авторизован», а файлы cookie сеанса и идентификатора пользователя исчезают. (Остается только файл cookie имени пользователя). Я попытался настроить файлы cookie с помощью samesite= «lax», но это ничего не изменило.
Есть ли способ сохранить файлы cookie?
Заранее спасибо,
Деннис
Версии: PHP 7.2 / Mediawiki 1.34.4
Комментарии:
1. Возможно, вам потребуется некоторое кодирование на стороне MediaWiki: см. mediawiki.org/wiki/Manual:SessionManager_and_AuthManager /. …
2. Спасибо за ваш ответ, Александр. Ваша рекомендация основана на том факте, что подход, описанный в моем вопросе, просто не поддается исправлению / выполним, или вы считаете, что более развернутый подход более безопасен и уместен? Причина, по которой я спрашиваю, заключается в том, что сайты 2 будут использоваться ограниченной аудиторией из нескольких десятков членов семьи для генеалогических исследований и документации и на самом деле не будут доступны «широкой публике»
3. Ваш подход может быть исправимым, но ненадежным. Если даже это удастся, это будет взлом, и он может перестать работать после обновления MediaWiki .
4. Зачем вам пытаться перезаписать те же файлы cookie, которые устанавливает MediaWiki?