2

アカウント管理 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 にどのような変更を加えますか?

4

2 に答える 2

0

この問題を 1 週間調査した後、私は上記のオプションを断念しました。MediaWiki のログイン機能の一部として、アカウント管理 Web サイトの認証 Cookie を作成する拡張機能を作成しました。私が遭遇した1つの問題は、他の人が役に立つと思うかもしれませんが、「setcookie」関数を使用した後、ページに既にHTMLが書き込まれているため、ページを更新するまでCookieが実際に設定されないことです。アカウント管理 Web サイト用の新しい認証コードを作成し、それを管理者 Mediawiki ログインの前にフィルターとして使用します。

于 2013-06-27T18:02:03.183 に答える