如何将Discourse与SimpleSAMLphp连接,作为SAML身份验证提供者(IDP)使用

Discourse其实内置了一个DiscourseSSO(现在叫DiscourseConnect),也就是官网那篇“Using Discourse as an identity provider (SSO, DiscourseConnect)”,但是你只要多看几眼就会发现,它提供的并不是标准SAML或者Oauth协议,而是一套它自己写好的API之类的东西。

那么怎么办呢?没关系,有一个巨佬已经帮我们写好了Discourse-SimpleSAMLphp这个插件了,这个插件允许我们将DiscourseConnect(DiscourseSSO)连接到SimpleSAMLphp然后使用SimpleSAMLphp来提供标准SAML服务。

那么接下来我们只需要花那么一丢丢时间弄懂什么是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/

它们默认是从GitHub抓的,所以要是你没开代理,那麻烦你下载它们的包之后上传到 /var/simplesamlphp 去。

你可能会问为什么一定得是在/var/simplesamlphp,很简单,因为官方教程就是放在这的,放别的地方要额外配置。

然后是将首页指向它文件夹里的www,然后配置nginx。如果你是apache,那它官网有对应的配置。

upstream saml-php-handler {
    server unix:/run/php/php8.0-fpm.sock;
}
server {
        listen 443 ssl;
        server_name 这里填你的域名;
        index index.php;
        ssl_certificate    这里填你的证书;
        ssl_certificate_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;
            }
        }
}

解释一下upstream saml-php-handler:saml-php-handler是为了防止你有别的已经占用了php-handler,就这么简单。在示例里我用的是php8.0,你在用什么版本的php就改成什么版本的。

然后更新一下源:

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’,改成你自己的密码;

找到’secretsalt’,改成你刚刚生成的那串盐;

找到’technicalcontact_name’,改成你的名字;

找到’technicalcontact_email’ ,改成你的邮箱;

找到 ‘language.default’,改成’zh’(也可以改成你的语言);

找到’timezone’,将 null 改成 ‘Asia/Shanghai’ (如果你在中国),或者改成你所在的地区;

最后,找到’enable.saml20-idp’,将其改为’true’,启动SAML IDP功能。

然后打开 https://你的域名/simplesaml ,理论上它就能访问了。

然后安装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 ,将version改成dev-master。这里这么做的原因是将discourse连接到simplesamlphp的那个插件在设置里写定了要求版本是dev-master,但实际上默认那里面写的是版本号,所以需要将版本号改为dev-master。

然后开始安装这个插件。

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

–ignore-platform-reqs 这个参数是为了防止你使用的php版本是8.0而出现错误。

不出意外的话你应该能看见composer在/var/simplesamlphp欢快地跑着,开始安装swcc/simplesamlphp-module-authdiscourse了。

安装完成后,在/var/simplesamlphp输入

touch modules/authdiscourse/enable

让这个插件启动。



然后在你的discourse论坛启动 enable discourse connect provider 和 discourse connect provider secrets 这两个选项。

在 discourse connect provider secrets 输入你的SAML域名,比如login.example.com和你设定的一个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' => '你的论坛域名',
      'secret' => '你刚刚设置的SSO密钥',
    ],

这一段,让它的认证方式添加上discourse。

最后,打开 https://你的SAML域名/simplesaml/module.php/core/authenticate.php?as=discourse-sso

或者

打开 https://你的SAML域名/simplesaml/ 然后点 认证/authentication 然后点discourse-sso然后测试。

如果返回了正确的信息,则说明你配置成功。

然后你需要配置你的IDP。

首先生成一个证书:

openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out 你的域名.crt -keyout 你的域名.pem

然后如果你是在root根目录生成的,你就能在root根目录看见你生成的新证书。

然后把证书挪到你需要放的地方,将它们赋予到用户www-data和755权限

chown -R www-data:www-data /你的证书存放路径
chmod -R 755 /你的证书存放路径

最后,在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' => '你的pem路径',
    'certificate' => '你的crt路径',
    /*
     * The authentication source which should be used to authenticate the
     * user. This must match one of the entries in config/authsources.php.
     * 注意:这里需要将认证方法改成discourse-sso
     */
    'auth' => 'discourse-sso',
];

现在你的SimpleSAMLphp以可使用Discourse作为用户数据库后端,作为SAML IDP,提供标准SAML登录协议。

IDP实体标识符:https://你的域名/simplesaml/saml2/idp/metadata.php

URL目标(用于SP发送验证请求):https://你的域名/simplesaml/saml2/idp/SSOService.php

X509证书:https://你的域名/simplesaml/module.php/saml/idp/certs.php/idp.crt

或者对于支持直接上传IDP Metadata文件的服务商,干脆直接下载IDP Metadata:https://你的域名/simplesaml/saml2/idp/metadata.php

到此,大功告成。

enjoy~

下一篇我会详细介绍如何将由Discourse驱动的SimpleSAMLphp与NextCloud连接作为NextCloud的SAML登录方式。

有什么不懂的地方或有什么可以指正的地方欢迎随时联系admin@rail.moe

2 个赞