首页 > 解决方案 > 从 WordPress 单点登录到媒体 wiki

问题描述

我正在尝试创建从 Wordpress 到 MediaWiki 的单点登录。我在我的 WordPress(Wordpress 插件)上运行了 WPOauthServer。在我的 wiki 上,我安装了 Extension:OAuth2 Client。我希望我的用户只登录 WordPress,然后他们可以从那里访问 wiki,而无需再次登录 wiki。WPOauthServer 工作正常,我使用的是 Grant 类型Authorization Code。我已经通过使用进行了测试,curl并且我能够获取授权码,并且使用授权码我可以获得身份验证令牌。

我的 wordpress 页面上有一个带有客户 ID 的按钮:

<a href="https://xxxxxx.de/oauth/authorize?response_type=code&client_id=XXXXXXXXX&state=123">Connect Your Account</a>

当我打开授权链接时,我被重定向到redirect-URI在服务器端的客户端设置中设置的以下内容:

https://wiki.XXXXXXXXXXXXX.de/wiki/Special:OAuth2Client/callback?code=farkmm4ttuwxnne8a9firwtdikmite788hwpyhzg&state=123 

在这里我得到一个内部错误:

Fatal exception of type "GuzzleHttp\Exception\RequestException

挖掘后我发现这个异常是在函数的扩展文件AbstractProvider.php中引起的sendRequest

/**
 * Sends a request instance and returns a response instance.
 *
 * @param  RequestInterface $request
 * @return ResponseInterface
 */
protected function sendRequest(RequestInterface $request)
{
    try {
        var_dump($request);
        $response = $this->getHttpClient()->send($request);
        var_dump($response);
    } catch (BadResponseException $e) {
        $response = $e->getResponse();
    }
    return $response;
}

异常是在$response = $this->getHttpClient()->send($request);

我认为我的请求可能有问题,根据var_dump请求进行操作会显示以下内容:

/var/www/mediawiki/w/extensions/MW-OAuth2Client/vendors/oauth2-client/src/Provider/AbstractProvider.php:629:
object(GuzzleHttp\Psr7\Request)[278]
  private 'method' => string 'POST' (length=4)
  private 'requestTarget' => null
  private 'uri' => 
    object(GuzzleHttp\Psr7\Uri)[279]
      private 'scheme' => string 'https' (length=5)
      private 'userInfo' => string '' (length=0)
      private 'host' => string 'xxxxxxx.de' (length=13)
      private 'port' => null
      private 'path' => string '/oauth/token/' (length=13)
      private 'query' => string '' (length=0)
      private 'fragment' => string '' (length=0)
  private 'headers' => 
    array (size=2)
      'Host' => 
        array (size=1)
          0 => string 'xxxxxx.de' (length=13)
      'content-type' => 
        array (size=1)
          0 => string 'application/x-www-form-urlencoded' (length=33)
  private 'headerNames' => 
    array (size=2)
      'content-type' => string 'content-type' (length=12)
      'host' => string 'Host' (length=4)
  private 'protocol' => string '1.1' (length=3)
  private 'stream' => 
    object(GuzzleHttp\Psr7\Stream)[287]
      private 'stream' => resource(18, stream)
      private 'size' => null
      private 'seekable' => boolean true
      private 'readable' => boolean true
      private 'writable' => boolean true
      private 'uri' => string 'php://temp' (length=10)
      private 'customMetadata' => 
        array (size=0)
          empty

来自 apache 日志的堆栈跟踪:

 Notice:  Undefined index: scopes in /var/www/mediawiki/w/extensions/MW-OAuth2Client/SpecialOAuth2Client.php on line 54, referer: https://XXXXXXerv.de/sso-test/
 Stack trace:, referer: https://XXXXXXerv.de/sso-test/
   1. {main}() /var/www/mediawiki/w/index.php:0, referer: https://XXXXXXerv.de/sso-test/
   2. MediaWiki->run() /var/www/mediawiki/w/index.php:42, referer: https://XXXXXXerv.de/sso-test/
   3. MediaWiki->main() /var/www/mediawiki/w/includes/MediaWiki.php:524, referer: https://XXXXXXerv.de/sso-test/
   4. MediaWiki->performRequest() /var/www/mediawiki/w/includes/MediaWiki.php:861, referer: https://XXXXXXerv.de/sso-test/
   5. SpecialPageFactory::getPage() /var/www/mediawiki/w/includes/MediaWiki.php:255, referer: https://XXXXXXerv.de/sso-test/
   6. SpecialOAuth2Client->__construct() /var/www/mediawiki/w/includes/specialpage/SpecialPageFactory.php:382, referer: https://XXXXXXerv.de/sso-test/
 Notice:  Undefined index: scopes in /var/www/mediawiki/w/extensions/MW-OAuth2Client/SpecialOAuth2Client.php on line 54, referer: https://XXXXXXerv.de/sso-test/
 Stack trace:, referer: https://XXXXXXerv.de/sso-test/
   1. {main}() /var/www/mediawiki/w/index.php:0, referer: https://XXXXXXerv.de/sso-test/
   2. MediaWiki->run() /var/www/mediawiki/w/index.php:42, referer: https://XXXXXXerv.de/sso-test/
   3. MediaWiki->main() /var/www/mediawiki/w/includes/MediaWiki.php:524, referer: https://XXXXXXerv.de/sso-test/
   4. MediaWiki->performRequest() /var/www/mediawiki/w/includes/MediaWiki.php:861, referer: https://XXXXXXerv.de/sso-test/
   5. SpecialPageFactory::executePath() /var/www/mediawiki/w/includes/MediaWiki.php:288, referer: https://XXXXXXerv.de/sso-test/
   6. SpecialPageFactory::getPage() /var/www/mediawiki/w/includes/specialpage/SpecialPageFactory.php:513, referer: https://XXXXXXerv.de/sso-test/
   7. SpecialOAuth2Client->__construct() /var/www/mediawiki/w/includes/specialpage/SpecialPageFactory.php:382, referer: https://XXXXXXerv.de/sso-test/

编辑: 从堆栈跟踪中,我意识到scope没有在媒体 wiki 客户端设置中定义localsettings.php,因此在设置范围后,我在 apache 日志中没有收到任何错误,但媒体 wiki 仍然显示内部错误Fatal exception of type "GuzzleHttp\Exception\RequestException

经过更多挖掘,我发现我遇到了一个curl: (60) SSL certificate: unable to get local issuer certificate错误,我通过将 CA Root 添加到我信任的 CA 来解决这个错误,有关更多信息,请参阅这篇文章

解决此问题后,我只需要更正以下内容:

$wgOAuth2Client['configuration']['username'] = 'user_login'; // JSON path to username
$wgOAuth2Client['configuration']['email'] = 'user_email'; // JSON path to email

查看从 WordPress 实施 SSO 的答案

标签: phpwordpressoauth-2.0single-sign-onmediawiki-extensions

解决方案


通过执行以下步骤,我能够设置从 WordPress 到媒体 wiki 的 SSO(单点登录):

  1. 首先你需要一个 OAuth 2.0 服务器,你可以自己实现它,在这里查看详细信息 运行你自己的 OAuth 2.0 服务器或者最简单的方法是使用 WordPress 插件WP Oauth 2.0 服务器,你不必购买专业版,你也可以使用 Authorization codes免费的 Grant 类型实现 SSO。

  2. 您需要在您的媒体 wiki 上安装 OAuth 2.0 客户端扩展,可以在此处找到该扩展,并按照那里的安装说明进行操作。

  3. 转到 WordPress 插件页面并激活 OAuth 服务器,然后导航到 OAuth 服务器并添加一个新客户端,为您的客户端命名并在重定向 URI 中添加媒体 wiki 扩展页面上的链接提及,即http://your.wiki.domain/path/to/wiki/Special:OAuth2Client/callback,然后转到 OAuth>clients 页面,其中您可以看到您新创建的客户端,单击编辑,在这里您可以在您的媒体 wiki中查看clientIDClient secret添加此 ID 和密码。localSettings.php

  4. 在 WordPress 上创建一个页面,并在其中添加带有您的客户端 ID 的以下按钮

    < a href="https://your-Domain-Where-OAuth-server-is-running.de/oauth/authorize?response_type=code&client_id=YOURCLIENTID&state=RANDOM-STRING&scope=basic"> go to wiki</a> 不要忘记输入,scope否则你会得到一个媒体 wiki 内部错误。

  5. 如果一切正常,那么您应该在从 WordPress 中单击此按钮后自动转到媒体 wiki 主页。media wiki 将显示您已登录。我花了一些时间才弄清楚我希望这对来到这里的任何人都有帮助。


推荐阅读