我正在尝试在帐户管理网站和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 Extension,我相信API没有使用要进行身份验证的扩展,因此未在MediaWiki
在使用LDAP身份验证时,是否有人成功使用MediaWiki API对用户进行身份验证?
对上面的代码或LocalSettings.php或api.php进行了哪些更改才能实现此目的?
答案 0 :(得分:1)
我刚遇到类似的问题。解决方案是在我的POST数据中包含一个额外的参数lgdomain
,设置为正确的LDAP域。
在MediaWiki API documentation上非常简短地提到过。您的示例代码中似乎缺少它。如果没有该参数,您将获得“WrongPass”作为您的登录结果。
答案 1 :(得分:0)
在花了一周的时间研究这个问题后,我放弃了上面的选项。我创建了一个扩展,为帐户管理网站创建一个身份验证cookie,作为MediaWiki登录功能的一部分。我遇到的一个问题,其他人可能会觉得有用,就是在使用'setcookie'函数之后,实际上不会设置cookie,直到刷新页面,因为已经有html写入页面,所以出于身份验证的目的,我有为帐户管理网站编写新的身份验证代码,然后在管理员Mediawiki登录之前将其用作过滤器。