Единый вход из WordPress в медиа-вики - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать единый вход из Wordpress в MediaWiki.У меня работает WPOauthServer на моем WordPress (плагин Wordpress).И на моей вики у меня установлено расширение: клиент OAuth2 .Я хочу, чтобы мои пользователи входили только в WordPress, и оттуда они могут перейти в вики, не заходя снова в вики.WPOauthServer работает нормально, я использую тип Grant Authorization Code.Я проверил, используя curl, и я могу получить код авторизации, и используя код авторизации, я могу получить токен аутентификации.

У меня есть кнопка на моей wordpress странице с идентификатором клиента:

<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 не определен в настройках клиента медиа-вики в localsettings.php, поэтому после настройки области я не получаюлюбые ошибки в логах apache, но медиа вики все ещеhows внутренняя ошибка Fatal exception of type "GuzzleHttp\Exception\RequestException

При дальнейшем копании я обнаружил, что у меня появляется ошибка curl: (60) SSL certificate: unable to get local issuer certificate, которую я решил, добавив Root CA Root в мой доверенный CA для получения дополнительной информации см. этот пост

После решения этой проблемы мне просто нужно исправить следующее:

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

см. Ответ по реализации SSO из WordPress

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я последовал ответу Ахмада выше и получил часть пути туда. Однако мне пришлось внести изменения в исходный код в одну строку и дополнительно настроить LocalSettings для медиа-вики, как первоначально размещено здесь: https://www.mediawiki.org/wiki/Topic:Ux1crr4vosyw0tjl

Повторяется для удобства: Я наконец-то начал работать с этими дополнительными шагами - редактированием моего LocalSettings.php хххх мой сайт, начинающийся с https://

В дополнение к настройке секрета и идентификатора мне пришлось заполнить параметры конфигурации этими настройками - они с моего сайта.

$ wgOAuth2Client ['configuration'] ['authorize_endpoint'] = 'xxxx / oauth / authorize'; // URL авторизации

$ wgOAuth2Client ['configuration'] ['access_token_endpoint'] = 'xxxx / oauth / token'; // токен URL

$ wgOAuth2Client ['configuration'] ['api_endpoint'] = 'xxxx / oauth / me? Access_token ='; // URL для получения пользователя JSON

$ wgOAuth2Client ['configuration'] ['redirect_uri'] = 'xxxx / mediawiki / index.php? Title = Special: OAuth2Client / redirect & returnto = Special% 3AUserLogin';

$ wgOAuth2Client ['configuration'] ['username'] = 'user_login'; // JSON-путь к имени пользователя

$ wgOAuth2Client ['configuration'] ['email'] = 'user_email'; // JSON путь к электронной почте

$ wgOAuth2Client ['configuration'] ['scopes'] = 'openid email profile'; // Права доступа

$ wgWhitelistRead = array ("Special: OAuth2Client");

Затем мне также пришлось внести одно изменение кода в ... / mediawiki / extensions / MW-OAuth2Client / vendors / oauth2-client / src / Provider / AbstractProvider.php

защищенная функция fetchResourceOwnerDetails (AccessToken $ token)

{

    $url = $this->getResourceOwnerDetailsUrl($token);

    // Added this line so we can build the url request properly otherwise it didn't append the token to the api_endpoint

    $url = $url . $token;

    $request = $this->getAuthenticatedRequest(self::METHOD_GET, $url, $token);

    return $this->getResponse($request);

}

После этого плагин работал как положено.

Примечание по установке расширения mediawiki. Я получил эти предупреждения композитора - я думаю, что их можно безопасно игнорировать ...

Пакет с жадностью / жадностью оставлен, следует избегать его использования. Вместо этого используйте guzzlehttp / guzzle.

Пакет phpunit / phpunit-mock-objects отклонен, его следует избегать. Замена не была предложена.

Пакет satooshi / php-coveralls заброшен, его следует избегать. Вместо этого используйте php-coveralls / php-coveralls.

Также я нашел эту ссылку полезной для понимания того, как использовать плагин wordpress: https://wp -oauth.com / docs / how-to / setup-wp-oauth-сервер-для-единого входа -с-WordPress /

И я обнаружил, что вы можете просто добавить плагин OAUTH в WordPress со страницы администрирования WP вашего сайта - просто нажмите кнопку «Добавить плагины» - или выполните поиск «клятвы» с помощью WP Oauth Server. Нет необходимости получать его из WP OATH. сайт, где можно найти только платную версию.

0 голосов
/ 03 апреля 2019

Мне удалось настроить SSO (единый вход) из WordPress в медиа-вики, выполнив следующие действия:

  1. Сначала вам нужен сервер OAuth 2.0, вы можете реализовать его самостоятельно. Подробности см. Здесь Запустите свой собственный сервер OAuth 2.0 или самый простой способ - использовать плагин WordPress WP Oauth Сервер 2.0 вам не нужно покупать профи, вы также можете внедрить SSO, используя тип гранта Authorization codes, который предоставляется бесплатно.

  2. Вам необходимо установить клиентское расширение OAuth 2.0 на вашей медиа-вики, расширение можно найти здесь , следуйте инструкциям по установке там.

  3. Перейдите на страницу плагина WordPress и активируйте OAuth-сервер, затем перейдите к OAuth-серверу и добавьте нового клиента, присвойте своему клиенту имя и в Redirect URI добавьте ссылку на ссылку на страницу расширения media wiki, например http://your.wiki.domain/path/to/wiki/Special:OAuth2Client/callback , затем перейдите на страницу OAuth> клиенты, где вы можете увидеть своего только что созданного клиента, нажмите «Изменить», и здесь вы увидите, как clientID и Client secret добавьте этот идентификатор и секрет в localSettings.php вашей медиа-вики.

  4. Создайте страницу на WordPress и поместите следующую кнопку с вашим идентификатором клиента

    < 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, иначе вы получите внутреннюю ошибку media wiki.

  5. Если все работало нормально, вы должны автоматически перейти на главную страницу медиа-вики после нажатия этой кнопки на вашем WordPress. media wiki покажет вам, как вы вошли в систему. Мне понадобилось некоторое время, чтобы понять это, я надеюсь, что это поможет любому, кто придет сюда.

...