アカウント管理 Web サイトと MediaWiki サイトの間に SSO を実装しようとしています。
MediaWiki サイトは LDAP を使用して認証し、ログインを管理者に制限します (編集、移動などの管理者権限を制限しますが、5000 人のユーザーがアカウントを更新したり、ディスク領域を表示したりするには、アカウント管理サイトにログインする必要があります。
これまでのところ、次の関数を使用して Mediawiki に正常に接続できますが、ユーザー名とパスワードを使用して認証することはできません。
function do_post_request($url, $data, $optional_headers = null) {
$params = array('http' => array(
'method' => 'POST',
'content' => $data));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
if (!$fp = @fopen($url, 'r', false, $ctx)) return FALSE;
$response = @stream_get_contents($fp);
return $response;
}
function mediawiki_login($username, $password) {
/*
* STEP 1: request mediawiki login via api
*/
$url='/wiki/api.php'; // EDIT THIS TO POINT TO YOUR WIKI API!
$data=http_build_query(array('format'=>'json',
'action' =>'login',
'lgname' =>$username,
'lgpassword'=>$password));
$headers="Content-type: application/x-www-form-urlencoded\r\n".
"Content-length: ".strlen($data)."\r\n".
"Connection: close\r\n";
$contents=do_post_request($url, $data, $headers);
if ($contents===FALSE) return FALSE;
$mwdata = json_decode($contents, true);
// check if the api answers as expected
if($mwdata["login"]["result"] != "NeedToken"){
return FALSE;
}
$token= $mwdata['login']['token'];
$cookieprefix= $mwdata['login']['cookieprefix'];
$sessionid= $mwdata['login']['sessionid'];
/*
* STEP 2: send token using sessionid cookie
*/
$data=http_build_query(array('format'=>'json',
'action' =>'login',
'lgname' =>$username,
'lgpassword'=>$password,
'lgtoken' => $token));
$headers="Content-type: application/x-www-form-urlencoded\r\n".
"Content-length: ".strlen($data)."\r\n".
"Cookie: ".$cookieprefix."_session=".$sessionid."\r\n".
"Connection: close\r\n";
$contents=do_post_request($url, $data, $headers);
if ($contents===FALSE) return FALSE;
$mwdata = json_decode($contents, true);
if($mwdata["login"]["result"] != "Success") return FALSE;
// login success, set the mediawiki cookies
$cookieprefix= $mwdata['login']['cookieprefix'];
$sessionid= $mwdata['login']['sessionid'];
$userid= $mwdata['login']['lguserid'];
$username= $mwdata['login']['lgusername'];
setcookie($cookieprefix.'UserID', $userid, 0, '/', '.yourdomain.tld', FALSE, TRUE); // INSERT YOUR DOMAIN
setcookie($cookieprefix.'UserName', $username, 0, '/', '.yourdomain.tld', FALSE, TRUE);
setcookie($cookieprefix.'_session', $sessionid, 0, '/', '.yourdomain.tld', FALSE, TRUE);
return TRUE;
}
私自身のデバッグ値を追加した後、私WrongPass
は 2 番目の後に戻っていることがわかりましdo_post_request
た。MediaWiki の LDAPAuthentication 拡張機能を使用しているため、API は認証に拡張機能を使用していないため、ユーザー名パスワードを見つけられません。 MediaWiki が使用するユーザー データベースの組み合わせ
LDAP 認証を使用しているときに、MediaWiki API を使用してユーザーの認証に成功した人はいますか?
これを可能にするために、上記のコード、LocalSettings.php、または api.php にどのような変更を加えますか?