我正在尝试在帐户管理网站和 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
在第二个之后返回do_post_request
由于我们使用 MediaWiki 的 LDAPAuthentication 扩展,我相信 API 没有使用扩展进行身份验证,因此没有找到用户名密码MediaWiki 使用的用户数据库中的组合
有没有人在使用 LDAP 身份验证时成功使用 MediaWiki API 对用户进行身份验证?
对上面的代码、LocalSettings.php 或 api.php 进行了哪些更改以使其成为可能?