php - 从 WordPress 单点登录到媒体维基

标签 php wordpress oauth-2.0 single-sign-on mediawiki-extensions

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

我的 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 

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

类型为“GuzzleHttp\Exception\RequestException 的致命异常

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

/**
 * 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 没有在 localsettings.php 的媒体 wiki 客户端设置中定义,所以在设置范围后我没有得到任何错误apache 日志,但 media wiki 仍然显示内部错误 Fatal exception of type "GuzzleHttp\Exception\RequestException

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

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

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

查看从 WordPress 实现 SSO 的答案

最佳答案

我能够按照以下步骤设置从 WordPress 到媒体维基的 SSO(单点登录):

  1. 首先您需要一个 OAuth 2.0 服务器,您可以自己实现它,请在此处查看详细信息 Run your own OAuth 2.0 Server或者最简单的方法是使用 WordPress 插件 WP Oauth 2.0 server您不必购买专业版,您也可以通过使用授权类型 Authorization codes 来实现 SSO这是免费的。

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

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

  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 将显示您已登录。我花了一些时间才弄清楚我希望这对来到这里的任何人有所帮助。

关于php - 从 WordPress 单点登录到媒体维基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55455954/

相关文章:

php - mysql 选择行号查询

wordpress - 如何添加 WordPress 管理页面而不将其添加到菜单中?

css - 在 wordpress 中设置 entry-meta 样式?

javascript - YouTube API : Is there a way to refresh an access_token in the client side v3 api?

java - Spring启动OAuth2实现: NoSuchBeanDefinitionException: No qualifying bean of type AuthenticationManager

php - 图像将 Tiff 转换为 png/jpg

php - 在 azure webapp linux 容器中安装 apcu PHP 扩展

wordpress - Woocommerce 结帐页面重定向到主页?

scala - 保护 Play 框架和 OAuth2 上的 REST API 的安全

php - cakephp 2.0 中的双下划线