我正在尝试创建从 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(单点登录):
首先您需要一个 OAuth 2.0 服务器,您可以自己实现它,请在此处查看详细信息 Run your own OAuth 2.0 Server或者最简单的方法是使用 WordPress 插件 WP Oauth 2.0 server您不必购买专业版,您也可以通过使用授权类型
Authorization codes
来实现 SSO这是免费的。您需要在您的媒体 wiki 上安装 OAuth 2.0 客户端扩展,该扩展可以在 here 中找到,按照那里的安装说明进行操作。
转到 WordPress 插件页面并激活 OAuth 服务器,然后导航到 OAuth 服务器并添加一个新客户端,为您的客户端命名并在重定向 URI 中添加媒体维基扩展页面上的链接提及,即
http://your.wiki.domain/path/to/wiki/Special:OAuth2Client/callback
,然后转到 OAuth>clients 页面,您可以在其中看到新创建的客户端,单击编辑,在这里您可以看到clientID
和Client secret
在localSettings.php
中添加此 ID 和密码您的媒体 wiki。在 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 内部错误。如果一切正常,那么在从您的 WordPress 单击此按钮后,您应该会自动转到媒体 wiki 主页。 media wiki 将显示您已登录。我花了一些时间才弄清楚我希望这对来到这里的任何人有所帮助。
关于php - 从 WordPress 单点登录到媒体维基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55455954/