centertap / discourse-sso-consumer
MediaWiki 扩展,通过 Discourse 讨论论坛的 DiscourseConnect(SSO)提供者 API 提供身份验证(作为 PluggableAuth 插件)
Requires
- php: >=7.4
- ext-curl: *
- ext-json: *
- composer/installers: ^1.0.1
- mediawiki/pluggable-auth: ~6.3
Requires (Dev)
- mediawiki/mediawiki-codesniffer: >=28.0.0
- mediawiki/minus-x: >=0.3.2
- php-parallel-lint/php-console-highlighter: >=0.3.2
- php-parallel-lint/php-parallel-lint: >=1.0.0
README
DiscourseSsoConsumer 是一个 MediaWiki 扩展,允许 MediaWiki 站点通过 Discourse 讨论论坛进行用户身份验证,使用论坛的单点登录(SSO)提供者功能。本扩展旨在促进维基和讨论论坛之间的无缝集成。
DiscourseSsoConsumer 扩展本身是 MediaWiki 的 PluggableAuth 扩展的一个插件。
此 DiscourseSsoConsumer 的显著特性包括
- 通过 Discourse 登录对维基用户进行身份验证;
- 根据 Discourse 组设置维基用户权限;
- 通过用户名或电子邮件将 Discourse 用户与现有维基用户关联,或在需要时创建新的维基用户;
- 为关联用户提供对 Discourse 用户信息的访问;
- 用户在维基和 Discourse 之间导航时的无缝身份验证;
- “单点登出”(至少在一个方向上)。
本扩展由 Center for Transparent Analysis and Policy 开发,这是一个 501(c)(3) 非营利组织。如果这个扩展对您的维基很有用,请考虑向 支持 CTAP 的捐赠。 您可以是 Discourse SSO 消费者的提供者!
先决条件
要使用 DiscourseSsoConsumer,您需要
- PHP >= 7.4.0
- MediaWiki >= 1.39
- DiscourseSsoConsumer 已在 MW 1.39 上开发和测试。有关较新版本可能的问题,请参阅 已知错误/问题。
- PluggableAuth 扩展
- DiscourseSsoConsumer 4.x.x 需要 PluggableAuth ~6.3
- 一个 Discourse 讨论服务器
安装
推荐安装方法是使用 composer
。这将自动安装任何依赖项,例如 PluggableAuth。
您可以通过手动方式安装此扩展(例如,使用
git clone
将此仓库克隆到您的站点的extensions/
目录),但这样您也需要手动管理其依赖项。
- 转到您的MediaWiki安装目录并运行两个
composer
命令
如果您想锁定此扩展的主版本(以便未来的更新不会意外引入破坏性更改),将第一个命令更改为类似以下内容(例如,对于主要版本“194”)$ cd YOUR-WIKI-INSTALL-DIRECTORY $ COMPOSER=composer.local.json composer require --no-update centertap/discourse-sso-consumer $ composer update centertap/discourse-sso-consumer --no-dev --optimize-autoloader
$ COMPOSER=composer.local.json composer require --no-update centertap/discourse-sso-consumer:^194.0.0
- 编辑您的站点的
LocalSettings.php
以加载扩展... wfLoadExtension( 'PluggableAuth' ); wfLoadExtension( 'DiscourseSsoConsumer' ); ...
- 运行
update.php
以将此扩展的表添加到您的维基数据库中$ cd YOUR-WIKI-INSTALL-DIRECTORY $ cd maintenance $ php update.php
- 继续配置Discourse和MediaWiki。
配置 Discourse
根据您想要使用的DiscourseSsoConsumer
功能,您可能需要配置Discourse的三个独立方面。
SSO 身份验证的 DiscourseConnect 提供者
如果您想通过Discourse实际验证用户,您需要在您的Discourse服务器上启用“DiscourseConnect提供程序”并设置一个共享密钥。
转到管理员 -> 设置 -> 登录
- 设置
启用discourse connect提供程序
。 - 将您的维基站点和秘密添加到
discourse connect提供程序秘密
中。- 选择一个安全的共享密钥(例如,使用密码生成器)。
- 记住您的MediaWiki配置中的密钥。
全局登出的 Discourse API 密钥
如果您想允许MediaWiki在Discourse上触发全局注销(即,从所有设备中注销用户),那么您还需要在Discourse上为其log_out
API创建一个API密钥。
转到管理员 -> API
- 点击
新建API密钥
。 - 输入
- 描述:(您想要的任何内容)
- 用户级别: 单个用户
- 用户: 系统
- 范围: 详细
- 范围: 启用 users: log out
- 点击
保存
并保留MediaWiki中的['DiscourseApi']['Key']
生成的密钥副本。
确保您的MediaWiki服务器可以直接连接到您的Discourse服务器。log_out
API请求由MediaWiki服务器直接发送到Discourse服务器(与登录时通过用户浏览器重定向的SSO请求不同)。
用户事件 Webhook
如果您想使MediaWiki实时获取更新后的用户信息(而不仅仅是当用户登录时),您可以在Discourse上配置一个webhook,告诉它将用户事件发送到MediaWiki。
首先
- 找出指向您的维基上
Special:DiscourseSsoConsumerWebhook
页面的URL。例如,类似于https://wiki.example.org/view/Special:DiscourseSsoConsumerWebhook
。 - 选择一个安全的共享密钥(例如,使用密码生成器)。
- 记住您的MediaWiki配置中的密钥。
接下来,转到Discourse上的管理员 -> API
- 选择
Webhooks
选项卡。 - 点击
新建Webhook
。 - 输入
- 有效负载URL:(指向您的维基上
Special:DiscourseSsoConsumerWebhook
的URL) - 内容类型: application/json
- 密钥:(您创建的共享密钥)
- 哪些事件应该触发此webhook? 选择单个事件。
- 用户事件
- 检查有效负载URL的TLS证书: 选中(推荐)
- 激活: 选中
- 有效负载URL:(指向您的维基上
- 点击
保存
并记住MediaWiki中的共享密钥。
确保您的Discourse服务器可以直接连接到您的MediaWiki服务器。webhook请求由Discourse服务器直接发送到MediaWiki服务器(与登录时通过用户浏览器重定向的SSO请求不同)。
配置 MediaWiki
设置DiscourseSsoConsumer
涉及设置其配置参数,以及PluggableAuth
和MediaWiki的一般参数。
配置 PluggableAuth 和 MediaWiki
至少,您需要在$wgPluggableAuth_Config
中添加一个条目,告诉PluggableAuth应使用DiscourseSsoConsumer。
$wgPluggableAuth_Config = [ 'MY-BUTTON-LABEL' => [ 'plugin' => 'DiscourseSsoConsumer' ] ];
将MY-BUTTON-LABEL
替换为您希望在维基的登录按钮中看到的任何字符串。(即使$wgPluggableAuth_EnableLocalLogin
被禁用,在某些情况下维基登录页面仍然可能会出现。因此,选择一个合理的值是值得的。)
您可能想调整PluggableAuth的配置,特别是
$wgPluggableAuth_EnableAutoLogin
- 在启用此功能之前,请参阅自动登录。
$wgPluggableAuth_EnableLocalLogin
- 如果此功能被禁用,则点击维基登录按钮将直接导航到Discourse登录窗口(跳过维基自己的登录页面)。
$wgPluggableAuth_EnableLocalProperties
- 如果此功能被启用,则Discourse的真实姓名和电子邮件地址将不会与MediaWiki同步;维基属性将保持不变。
如PluggableAuth文档中所述,您可能想配置MediaWiki权限,允许扩展自动为认证用户创建新的维基账户。在LocalSettings.php
中添加如下内容:
# Allow auth extensions to generate new local users. $wgGroupPermissions['*']['autocreateaccount'] = true;
您可能还需要调整这些MediaWiki参数:
$wgObjectCacheSessionExpiry
- 设置非活动会话的超时时间。
$wgExtendedLoginCookieExpiration
- 设置“保持登录”登录的生存期。
$wgRememberMe
- 设置“保持登录”的操作模式。
有关后三个参数的更多详细信息,请参阅自动登录。
使用钩子函数配置 DiscourseSsoConsumer ⚠️
而不是直接在LocalSettings.php
中设置全局变量,首选的配置DiscourseSsoConsumer参数的方式是使用DiscourseSsoConsumer_Configure
钩子,如下面的示例所示
$wgHooks['DiscourseSsoConsumer_Configure'][] = function ( array &$config ) { $config['DiscourseUrl'] = 'https://discourse.example.org'; $config['Sso']['Enable'] = true; $config['Sso']['SharedSecret'] = 'SETECAstronomy'; $config['Sso']['EnableSeamlessLogin'] = true; $config['Sso']['EnableAutoRelogin'] = true; $config['GroupMaps'] = [ 'sysop' => [ '@ADMIN@' ], 'bureaucrat' => [ '@ADMIN@' ], 'quitetrusted' => [ 'trust_level_3', 'trust_level_4', ], ]; $config['Webhook']['Enable'] = true; $config['Webhook']['SharedSecret'] = 'MyVoiceIsMyPassword'; $config['Webhook']['AllowedIpList'][] = '192.168.22.11'; return true; };
您的钩子函数将被调用,并带有预填充的数组$config
,其中包含扩展的内置默认值,您可以根据需要对其进行修改。建议修改此数组,而不是完全替换它,以便从未来版本中添加的任何新默认参数中受益。
确保在函数签名中包含和号&
: function ( array &$config )
!⚠️
配置参数目录
技术上讲,DiscourseSsoConsumer扩展只有一个配置参数:$wgDiscourseSsoConsumer_Config
。这是一个数组,整个配置都放入这个单一数组中。通过通过钩子函数设置配置(见上方),永远不需要关心数组的实际变量名。
配置是分层的,通过嵌套数组表示。因此,一些值位于顶层 —— $config['key']
—— 而另一些则更深 —— $config['key1']['key2']
。
以下是可用参数的摘要;详细信息见下文。
以下是详细信息:
-
['DiscourseUrl']
- 字符串,必须 —— 没有默认值
- 指定Discourse服务器的基本URL,通常是
https://my-discourse-server.example.org
的形式(无尾斜杠)。
-
['Sso'] - 关于Discourse的SSO API的子配置,也称为“DiscourseConnect”。这是验证MediaWiki用户对Discourse的核心功能。
-
['Sso']['Enable']
- 布尔值,默认值:
false
- 是否启用单点登录功能,即通过Discourse服务器进行身份验证。
- 布尔值,默认值:
-
['Sso']['SharedSecret']
- 字符串,必须 —— 没有默认值
- 指定与Discourse服务器共享的秘密,通过其
discourse connect provider secrets
设置。
-
['Sso']['ProviderEndpoint']
- 字符串,默认值:
/session/sso_provider
- 指定Discourse服务器的SSO提供程序端点;将构造一个完整的URL,通过在其前面添加
DiscourseUrl
。
- 字符串,默认值:
-
['Sso']['EnableSeamlessLogin']
- 布尔值,默认值:
false
- 如果为
true
,则自动登录从未登录过的访客到维基,如果他们已经登录到Discourse。 - 请参阅下方的自动登录以获取该功能的更多详细信息。
- 布尔值,默认值:
-
['Sso']['EnableAutoRelogin']
- 布尔值,默认值:
false
- 如果设置为
true
,当用户因会话超时等原因登出时,将自动重新登录之前登录过的用户。 - 请参阅下方的自动登录以获取该功能的更多详细信息。
- 布尔值,默认值:
-
-
['User']
- 子配置,用于控制从Discourse到MediaWiki的用户身份映射和同步。此同步发生在SSO身份验证和webhook事件处理期间。-
['User']['LinkExistingBy']
-
数组,默认值:
[]
(空数组) -
一个或多个字符串实例的数组,包括
email
和/或username
,以任意顺序指定如何将Discourse凭据链接到现有的MediaWiki账户。DiscourseSsoConsumer跟踪Discourse用户ID与MediaWiki用户ID的关联。当它遇到具有新ID的Discourse凭据时,它将通过遍历
LinkExistingBy
中指定的方法来尝试找到匹配的MediaWiki用户。email
方法将查找匹配的电子邮件地址。username
将查找匹配的规范用户名。如果在遍历列表后没有找到匹配项(或未指定任何方法),如果可能,将创建新的MediaWiki账户。(如果找不到/创建账户,则身份验证将失败。)注意,
email
方法需要启用['User']['ExposeEmail']
(见下文)。
-
-
['User']['ExposeName']
-
布尔值,默认值:
false
-
指定Discourse用户的完整姓名是否会被公开到MediaWiki。Discourse和MediaWiki的隐私控制不同,难以协调。如果Discourse站点的策略中姓名不是完全公开的,最好根本不要将其公开到MediaWiki。
此设置会影响报告给PluggableAuth的真实姓名,默认情况下将更新账户的真实姓名。如果
ExposeName
为true
,Wiki真实姓名将设置为Discourse SSO凭证中的名称;如果false
,Wiki真实姓名将设置为空字符串。无论如何,DiscourseSsoConsumer将控制用户的Wiki真实姓名。如果您希望
DiscourseSsoConsumer
不修改真实姓名,请参阅$wgPluggableAuth_EnableLocalProperties
。
-
-
['User']['ExposeEmail']
-
布尔值,默认值:
false
-
指定用户的电子邮件地址是否会被公开到MediaWiki。Discourse和MediaWiki的隐私控制不同,难以协调。如果Discourse站点的策略中电子邮件地址不是完全公开的,最好根本不要将其公开到MediaWiki。
此设置会影响报告给
PluggableAuth
的电子邮件地址,默认情况下将更新账户的电子邮件地址。如果ExposeEmail
为true
,Wiki电子邮件地址将设置为Discourse SSO凭证中的电子邮件地址;如果false
,Wiki电子邮件地址将设置为空字符串。无论如何,
DiscourseSsoConsumer
将控制用户的Wiki电子邮件地址。如果您希望DiscourseSsoConsumer
不修改电子邮件地址,请参阅$wgPluggableAuth_EnableLocalProperties
。
-
-
['User']['GroupMaps']
-
数组,可选 - 无默认值
-
指定如何根据Discourse凭据推导出MediaWiki组成员资格。如果设置,它应该是一个表单的数组
[ 'MW-GROUP-1' => [ 'D-GROUP-X', 'D-GROUP-Y', ... ], 'MW-GROUP-2' => [ 'D-GROUP-A', 'D-GROUP-B', ... ], ]
其中每个条目指定在给定的MediaWiki组(例如,
MW-GROUP-1
)中严格确定成员资格,至少是列表中列出的Discourse组(例如,D-GROUP-X
)的成员资格之一。当DiscourseSsoConsumer
处理Discourse中的组信息时,将更新指定组的成员资格;未在GroupMaps
中作为键提到的组将不受影响。可以使用两个特殊令牌
@ADMIN@
和@MODERATOR@
来表示Discourse用户的管理员和版主状态。例如,[ 'sysop' => [ '@ADMIN@' ], 'bureaucrat' => [ '@ADMIN@' ] ];
将导致根据用户在Discourse中的管理员状态设置用户的
sysop
和bureaucrat
组成员资格,并且不会影响任何其他MediaWiki组。
-
-
-
['DiscourseApi']
- 用于涉及 Discourse API 功能(MediaWiki 到 Discourse 的后端请求)的子配置-
['DiscourseApi']['Username']
- 字符串,默认值:
system
- 用于发起 Discourse API 请求的用户名。如果
['EnableLogout']
设置为true
,则必须设置。
- 字符串,默认值:
-
['DiscourseApi']['Key']
- 字符串,无默认值
- 用于发起 Discourse API 请求的密钥,在配置 API 时在 Discourse 服务器上生成。如果
['EnableLogout']
设置为true
,则必须设置。
-
['DiscourseApi']['EnableLogout']
- 布尔值,默认值:
false
- 如果为
true
,则从 MediaWiki 登出也将从全局(即所有设备上的所有会话)登出用户。有关此功能的更多详细信息,请参阅下面的 注销。
- 布尔值,默认值:
-
['DiscourseApi']['LogoutEndpoint']
- 字符串,默认值:
/admin/users/{id}/log_out.json
- Discourse 服务器 log_out API 的端点;完整 URL 将通过在前面添加
['DiscourseUrl']
构建。子字符串{id}
将被登出用户的 id 替换。如果['EnableLogout']
设置为true
,则必须设置。
- 字符串,默认值:
-
-
['Webhook']
- 用于涉及 Discourse webhook 功能(Discourse 到 MediaWiki 的后端请求)的子配置-
['Webhook']['Enable']
- 布尔值,默认值:
false
- 如果为
false
,则 Discourse 的 webhook 请求将被忽略。如果为true
,则必须同时设置['SharedSecret']
和['AllowedIpList']
。
- 布尔值,默认值:
-
['Webhook']['SharedSecret']
- 字符串,无默认值
- 在 Discourse 上配置 webhook 时使用的密钥。如果启用了 webhook 处理,则必须非空且非空。
-
['Webhook']['AllowedIpList']
- 字符串数组,默认值:
[]
- 包含信任 IP 地址的字符串列表,用于 Discourse 服务器。如果启用了 webhook 处理,则必须非空。只有来自此列表的请求才会被处理。
- 字符串数组,默认值:
-
['Webhook']['IgnoredEvents']
-
关键字字符串数组,默认值:
['user_created']
-
应被忽略的 Discourse 用户事件列表。有效的关键字有
user_created
user_confirmed_email
user_approved
user_logged_in
user_updated
user_logged_out
user_destroyed
user_created
默认被忽略,因为未确认的用户可以自动擦除/删除。在 MediaWiki 中链接/创建用户之前等待user_confirmed_email
事件更合理。
-
-
-
['Logout']
- 用于涉及注销操作和事件的子配置-
['Logout']['OfferGlobalOptionToUser']
- 布尔值,默认值:
false
- 如果为
true
,则用户注销确认页面上将出现一个复选框,允许用户从所有设备/会话中注销,而不仅仅是他们正在注销的设备。 - 有关更多详细信息,请参阅下面的 注销。
- 布尔值,默认值:
-
['Logout']['ForwardToDiscourse']
- 布尔值,默认值:
false
- 如果为
true
,则 MediaWiki 上的注销操作将被传播到 Discourse。 - 有关更多详细信息,请参阅下面的 注销。
- 布尔值,默认值:
-
['Webhook']['HandleEventFromDiscourse']
- 布尔值,默认值:
false
- 如果为
true
,则用户的user_logged_out
事件将导致该用户的所有 MediaWiki 会话被无效化,从而从所有设备全局登出。 - 有关更多详细信息,请参阅下面的 注销。
- 布尔值,默认值:
-
提示、技巧、更多细节
登出
在“DiscourseConnect”设计中,注销只是一时兴起,因此 MediaWiki 与 Discourse 的完整 单点登出 集成目前尚不可行。但我们已经实现了大约 3/4 的功能。
注销有两种范围
- 本地:单个浏览器/设备的会话无效化,通常意味着清理 cookie 状态;
- 全局:无效化用户的所有会话,即从所有设备登出用户。
有两种可能的注销流程方向
- MediaWiki 启动:注销由 MediaWiki 启动/发起,并转发到 Discourse。
- Discourse 启动:注销由 Discourse 启动/发起,并转发到 MediaWiki。
有四种组合,其中我们可以完成三种
我们无法做到的是,当用户点击Discourse的登出按钮(即本地登出Discourse)时,也同时从MediaWiki中登出(同一浏览器从MediaWiki登出)。
['Logout']['HandleEventFromDiscourse']
控制是否在接收到Discourse的 user_logged_out
事件时触发全局登出。如果启用此功能,则还必须启用 ['Webhook']['Enable']
并当然,还需要与Discourse设置webhook。(见 用户事件Webhook。)
['Logout']['ForwardToDiscourse']
控制MediaWiki上的任何登出事件是否转发到Discourse。如果启用此功能,则还必须启用 ['Sso']['Enable']
并当然,还需要与Discourse设置SSO。(见 DiscourseConnect提供商用于SSO身份验证。)可能还需要启用 ['DiscourseApi']['EnableLogout']
;请继续阅读。
['Logout']['OfferGlobalOptionToUser']
控制是否给用户执行全局登出的选项。如果启用此功能且 ['Logout']['ForwardToDiscourse']
也启用,则还必须启用 ['DiscourseApi']['EnableLogout']
,因为这是全局登出所使用的机制。(见 Discourse API密钥用于全局登出,以及更多内容。)
关于Discourse user_logged_out
事件的注意事项
在这些情况下,Discourse会发出全局的 user_logged_out
webhook事件
- 用户点击 登出,并且Discourse已配置为
严格登出
。 - 管理员/版主暂停了用户。
- 管理员删除了用户。(实际上,在这种情况下会发出一个
user_destroyed
事件,但 DiscourseSsoConsumer 会将其视为user_logged_out
事件。)
然而,尽管以下条件会导致Discourse上的全局登出,但在以下情况下,它不会发出 user_logged_out
事件:
- 用户通过首选项/安全屏幕使用 全部登出。
- 管理员使用户匿名化。
这种不一致可能是Discourse中的一个错误。
MediaWiki 会话有效期
默认情况下,Discourse会尝试让用户永远登录。 (请参阅其 持久会话
和 最大会话年龄
设置,分别默认启用和60天。)
MediaWiki确实有“保持我登录”选项。然而
- 如果用户选择从Discourse登出,就没有好的方法来自动将用户从MediaWiki中登出。
- 如果禁用
$wgPluggableAuth_EnableLocalLogin
,用户通常永远不会看到带有“保持我登录”复选框的页面。但是,在某些错误条件下,他们会看到该页面,看到该复选框可能会令人困惑。
因此,您可能希望完全禁用MediaWiki上的“保持我登录”。在MW 1.35中,可以通过将 $wgExtendedLoginCookieExpiration
设置为零来实现。
如果禁用此功能,则所有不活跃的MediaWiki会话将在 $wgObjectCacheSessionExpiry
设置的超时后过期,该超时默认为1小时。
DiscourseSsoConsumer 可以配置为方便地自动重新验证过期的会话;请阅读下面的 自动重新登录。
自动登录
DiscourseSsoConsumer 有三种“自动登录”模式可用。它们影响用户导航到维基页面上发生的事情。
- PluggableAuth 的 自动登录 (
$wgPluggableAuth_EnableAutoLogin
)- 始终将未登录用户重定向到登录流程;
- 禁用
登出
按钮; - 阻止对维基的匿名访问。
- DiscourseSsoConsumer 的 自动重新登录 (
['Sso']['EnableAutoRelogin']
)- 将静默地通过Discourse重新验证用户,但前提是他们 已登录到维基 并且他们仍然登录到Discourse;
- 不会禁用登出,也不会在用户明确登出后尝试重新登录;
- 不会阻止匿名访问维基。
- DiscourseSsoConsumer 的 无缝登录 (
['Sso']['EnableSeamlessLogin']
)- 在用户首次访问维基时,如果他们已经在 Discourse 登录,将通过 Discourse 验证用户身份;对后续访问没有影响;
- 不会禁用登出,也不会在用户明确登出后尝试重新登录;
- 不会阻止匿名访问维基。
PluggableAuth (PA) 的 自动登录 旨在用于只允许登录用户访问的维基。由于 PA 的 自动登录 完全不允许匿名访问页面,因此没有必要同时启用其他模式。(例如,如果用户会话过期,PA 的 自动登录 将自动确保他们在下次访问时再次进行身份验证。)因此,如果您启用了 PA 的 自动登录,则不要启用 DiscourseSsoConsumer 的任何模式。
DiscourseSsoConsumer 的 自动重新登录 旨在在用户会话过期的情况下(例如,由于空闲超时)尝试保持已登录用户处于登录状态。当先前登录的用户访问维基时,自动重新登录 模式将通过浏览器重定向探测 Discourse 以获取用户的身份验证状态。如果他们仍在 Discourse 登录,他们将获得新的维基会话。如果不这样做,他们将保持匿名,并且 自动重新登录 不会再次尝试——如果用户想的话,他们可以点击登录按钮,并被重定向到 Discourse 以显式登录。
自动重新登录 的目的是提供与 Discourse 本身更相似的用户体验,即只要用户在 Discourse 登录,他们将保持在 MediaWiki 上登录。如果没有启用此选项,用户将在当前会话超时后的一段时间内被静默地从 MediaWiki 中注销。如果您启用此选项,则可能想 禁用 $wgPluggableAuth_EnableLocalLogin
,否则用户在每次重新登录时都必须看到 Userlogin
中间页面,并点击通过 Discourse SSO。
DiscourseSsoConsumer 的 无缝登录 旨在允许已登录 Discourse 的用户导航到 MediaWiki 并在到达后立即登录。换句话说,它试图提供从 Discourse 到 MediaWiki 的 无缝 过渡。然而,无缝登录 只影响用户对维基的 第一次 访问(按设备/浏览器计算)。如果他们在第一次访问时未在 Discourse 登录,则需要显式登录维基。
使用 PA 的 自动登录 与 DiscourseSsoConsumer 的任何模式一起使用都不太合理,但肯定可以在 DiscourseSsoConsumer 之间使用。
Webhook、用户记录和扩展 API
当启用 webhook 处理并接收到用户事件时,DiscourseSsoConsumer 将从 Discourse 接收相当完整的数据记录。该记录将被存储在 MediaWiki 数据库中,包括关于事件本身的信息(时间戳、事件类型、事件 ID)。
这些数据将按从 Discourse 接收的原始格式存储。这里不应用
['User']
配置中定义的映射。
其他扩展/函数可以通过使用 DiscourseSsoConsumer 提供的公共 API 获取和使用这些数据。有关更多详细信息,请查看源代码中的 ApiV1/Connector.php
。
例如
use MediaWiki\Extension\DiscourseSsoConsumer\ApiV1\Connector; function getUserAvatarUrlAndTimezone( User $user, int $size ) { $record = Connector::getUserRecord( $user ); $template = $record->user_record->avatar_template ?? null; $avatarUrl = null; if ( $template !== null ) { $avatarUrl = str_replace( '{size}', (string)$size, $template ); } $timezone = $record->user_record->user_option->timezone ?? null; return [ $avatarUrl, $timezone ]; }
要描述 Discourse 用户数据本身,最好的办法是设置一个 webhook 并使用 Discourse 的 webhook 日志检查某些事件的 JSON 内容。(Discourse 方便地记录了每个 webhook 的每个事件的请求和响应。)
发行说明
参见 RELEASE-NOTES.md
。
已知错误/问题
- 该扩展尚未在集群/负载均衡数据库环境中进行测试,可能存在微妙/意外的错误。
- 没有处理 Discourse 用户名更改。
- 没有处理 Discourse 用户删除或匿名化。
- 注销处理不是完全对称的:由于 Discourse 的限制,本地 Discourse 注销无法传播到 MediaWiki。
- 参见 关于 Discourse
user_logged_out
事件的注意事项。 - 语篇尚未(可能?)在所有可能/应该发出
user
webhook 事件的情况下发出。请参阅 https://meta.discourse.org/t/missing-webhook-user-events-by-design-or-oversight/273579 - 请在源代码中查看
TODO
注释。
许可
本作品受GPL 3.0许可(或任何后续版本)的许可。
SPDX-License-Identifier: GPL-3.0-or-later
版权所有 2024 马特·马兰诺维奇