MediaWiki Api + LDAPAuthentication

时间:2013-06-18 21:45:47

标签: mediawiki mediawiki-api mediawiki-extensions

我正在尝试在帐户管理网站和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进行了哪些更改才能实现此目的?

2 个答案:

答案 0 :(得分:1)

我刚遇到类似的问题。解决方案是在我的POST数据中包含一个额外的参数lgdomain,设置为正确的LDAP域。

MediaWiki API documentation上非常简短地提到过。您的示例代码中似乎缺少它。如果没有该参数,您将获得“WrongPass”作为您的登录结果。

答案 1 :(得分:0)

在花了一周的时间研究这个问题后,我放弃了上面的选项。我创建了一个扩展,为帐户管理网站创建一个身份验证cookie,作为MediaWiki登录功能的一部分。我遇到的一个问题,其他人可能会觉得有用,就是在使用'setcookie'函数之后,实际上不会设置cookie,直到刷新页面,因为已经有html写入页面,所以出于身份验证的目的,我有为帐户管理网站编写新的身份验证代码,然后在管理员Mediawiki登录之前将其用作过滤器。