DiscourseConnect (DiscourseSSO) を SimpleSAMLphp に設定する、Discourse フォーラムを SAML IDP (Identify Provider) として使用する

Discourse には、Discourse を SSO プロバイダーとして利用できる DiscourseConnect が統合されています。これは 「Discourse を ID プロバイダー (SSO, DiscourseConnect) として使用する」 という記事で見つけることができます。ただし、提供されるのは標準の SAML または OAuth プロトコルではありません。

そのため、Discourse フォーラムの Paul B. が作成した モジュール を使用する必要があります。これは、DiscourseConnect を SimpleSAMLphp に接続し、SimpleSAMLphp を使用して標準の SAML ログインサービスプロトコルを提供するモジュールです。彼の協力に感謝します。このモジュールは、こちらでも見つけることができます。

さあ、ガイドを始めましょう。

まず、SimpleSAMLphp を設定する必要があります。

まず SimpleSAMLphp をダウンロードします。

wget https://simplesamlphp.org/download?latest

次に解凍します。

tar zxf download?latest

そしてファイルを /var/simplesamlphp に移動します。

sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

次に、このフォルダを www-data ユーザーに 755 の権限で与えます。

sudo chown -R www-data:www-data /var/simplesamlphp/
sudo chmod -R 755 /var/simplesamlphp/

パスが /var/simplesamlphp でなければならない理由を尋ねるかもしれませんが、公式ドキュメントがそこにあるためです。他の場所に配置する場合は追加の設定が必要です。

次に nginx を設定し、インデックスをそのフォルダの /www にポイントします。apache を使用している場合は、公式ドキュメントで設定を見つけてください。

upstream saml-php-handler {
    server unix:/run/php/php8.0-fpm.sock;
}

server {
        listen 443 ssl;
        server_name YOUR_SAML_DOMAIN;
        index index.php;
        ssl_certificate    YOUR_CERT;
        ssl_certificate_key    YOUR_KEY;
        ssl_protocols          TLSv1.3 TLSv1.2;
        ssl_ciphers            EECDH+AESGCM:EDH+AESGCM;
        location ^~ /simplesaml {
            alias /var/simplesamlphp/www;
            location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
                include          fastcgi_params;
                fastcgi_pass     saml-php-handler;
                fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
                # Must be prepended with the baseurlpath
                fastcgi_param SCRIPT_NAME /simplesaml$phpfile;
                fastcgi_param PATH_INFO $pathinfo if_not_empty;
            }
        }
}

次にソースを更新します。

sudo apt update

そしてソフトウェアパッケージをインストールします。

sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

注意:ここでは、PHP のバージョンに応じてインストールする必要があります。たとえば、php8.0 を使用している場合は、すべての “php” の後に “8.0” を追加する必要があります。例:php8.0-xml

インストールが完了したら、Nginx を再起動して新しい PHP 拡張機能を有効にします。

sudo systemctl restart Nginx

次にソルトを生成します。

openssl rand -base64 32

このソルトをコピーします。

次に /var/simplesamlphp/config/config.php を開きます。

'auth.adminpassword',YOUR_PASSWORD;
'secretsalt',YOUR_SALT;
'technicalcontact_name',YOUR_NAME;
'technicalcontact_email' ,YOUR_EMAIL;
'language.default',CHANGE_TO_YOUR_LANGUAGE;
'timezone',CHANGE_TO_YOUR_AREA;
'enable.saml20-idp' => true,

次に https://YOUR_SAML_DOMAIN/simplesaml を開きます。理論的には、SimpleSAMLphp はこれで動作するはずです。

次に Composer をインストールします。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/bin/composer

次に composer を実行できるようになります。

/var/simplesamlphp に移動し、composer.json を編集してバージョンを dev-master に変更します。

これをここで行う理由は、discourse-simplesamlphp モジュールが “dev-master” バージョンを必要としますが、デフォルトバージョンは数値であるため、バージョンを “dev-master” に変更する必要があるからです。

次に、このモジュールのインストールを開始します。

composer require swcc/simplesamlphp-module-authdiscourse dev-master --ignore-platform-reqs

“–ignore-platform-reqs” パラメーターは、PHP バージョンが要件に一致しない場合に発生する問題を回避するためです。

これで、composer が swcc/simplesamlphp-module-authdiscourse をインストールし始めるはずです。

インストールが完了したら、次を入力します。

touch /var/simplesamlphp/modules/authdiscourse/enable

このプラグインを有効にします。



次に、Discourse フォーラムで「discourse connect provider secrets」と「enable discourse connect provider」の 2 つのオプションを有効にします。

discourse connect provider secrets」に SAML ドメインと sso シークレットを入力します。

次に、simplesamlphp フォルダの config/authsources.php を編集します。

<?php
$config = [
    // This is a authentication source which handles admin authentication.
    'admin' => [
        'core:AdminPassword',
    ],

    // This is the authentication source using the Discourse authentication.
    'discourse-sso' => [
      'authdiscourse:Discourse',
      'url' => 'https://discourse.your-domain.org',
      'secret' => '<your-sso-secret>',
    ],

];

この部分を適切な場所に追加する必要があります。

    'discourse-sso' => [
      'authdiscourse:Discourse',
      'url' => 'YOUR_DISCOURSE_DOMAIN',
      'secret' => 'DISCOURSE_SSO_SECRET',
    ],

SimpleSAMLphp が認証に discourse-sso を使用できるようにします。

最後に、https://YOUR_SAML_DOMAIN/simplesaml/module.php/core/authenticate.php?as=discourse-sso を開きます。

または

https://YOUR_SAML_DOMAIN/simplesaml/ を開き、認証をクリックし、discourse-sso をクリックしてテストします。

正しい情報が返された場合は、SimpleSAMLphp が Discourse に正常に接続されたことを意味します。

次に IDP 設定を構成する必要があります。

まず、IDP 用の証明書を生成する必要があります。

openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out YOUR_SAML_DOMAIN.crt -keyout YOUR_SAML_DOMAIN.pem

ルートディレクトリで生成した場合、新しい証明書がそこに表示されます。

次に、証明書を任意の場所に移動し、www-data ユーザーに 755 の権限を与えます。

chown -R www-data:www-data /YOUR_CERT_PATH
chmod -R 755 /YOUR_CERT_PATH

最後に、metadata/saml20-idp-hosted.php で証明書のパスと認証ソースを編集します。

<?php
$metadata['__DYNAMIC:1__'] = [
    /*
     * The hostname for this IdP. This makes it possible to run multiple
     * IdPs from the same configuration. '__DEFAULT__' means that this one
     * should be used by default.
     */
    'host' => '__DEFAULT__',

    /*
     * The private key and certificate to use when signing responses.
     * These are stored in the cert-directory.
     */
    'privatekey' => '/YOUR_KEY_PATH',
    'certificate' => '/YOUR_CERT_PATH',
    /*
     * The authentication source which should be used to authenticate the
     * user. This must match one of the entries in config/authsources.php.
     * NOTICE: YOU NEED TO CHANGE THE AUTH METHOD TO "discourse-sso"
     */
    'auth' => 'discourse-sso',
];

これで、SimpleSAMLphp は Discourse をユーザーデータベースバックエンドとして使用し、SAML IDP として標準の SAML ログインプロトコルを提供します。

IDP ID (URI): https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php

URL ターゲット (SP 識別要件送信に使用): https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/SSOService.php

X509 Cert: https://YOUR_SAML_DOMAIN/simplesaml/module.php/saml/idp/certs.php/idp.crt

または、IDP メタデータファイルを直接アップロードできる SP の場合は、IDP メタデータをダウンロードできます: https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php

すべて完了です。すべてが正常に動作するはずです。

お楽しみください〜

次に、Discourse を搭載した SimpleSAMLphp を NextCloud の SAML ログイン方法として接続する方法を紹介するかもしれません。

誤解があった場合は、この投稿に返信する か、admin@rail.moe までご連絡ください。

「いいね!」 11

このガイドをありがとうございます!実際にこの切り替えを行うことに非常に興味があります!これをどのように設定すればよいのか完全には理解できませんでしたが、機会があれば試してみます。

最近、これを試した人はいますか? Discourse 3.3 と SimpleSAMLphp 2.2.1 を実行していますが、動作させることができません。テスト段階です。リンクはもう機能しませんが、SimpleSAML の管理パネルにテストオプションを見つけました。しかし、ここで例外が発生しています。

SimpleSAML\Error\Error: UNHANDLEDEXCEPTION
Backtrace:
3 src/SimpleSAML/Error/ExceptionHandler.php:35 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)
2 vendor/symfony/error-handler/ErrorHandler.php:535 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)
1 vendor/symfony/error-handler/ErrorHandler.php:627 (Symfony\Component\ErrorHandler\ErrorHandler::handleFatalError)
0 [builtin] (N/A)
Caused by: Symfony\Component\ErrorHandler\Error\FatalError: Compile Error: Declaration of SimpleSAML\Module\authdiscourse\Auth\Source\Discourse::authenticate(&$state) must be compatible with SimpleSAML\Auth\Source::authenticate(array &$state): void
Backtrace:
0 modules/authdiscourse/lib/Auth/Source/Discourse.php:73 (N/A)

すべての手順を何度も確認しましたが、モジュールは 4 年間更新されておらず、互換性がないのではないかと心配しています。これを使用している人はまだいますか?

では、DiscourseConnectはどのプロトコルを使用していますか? OAuth2クライアントを試していましたが、パラメータがまったく同じではないことに気づきました :frowning:

「いいね!」 1