centertap/discourse-sso-consumer

MediaWiki 扩展,通过 Discourse 讨论论坛的 DiscourseConnect(SSO)提供者 API 提供身份验证(作为 PluggableAuth 插件)

资助包维护!
向 Ctap 捐赠

安装: 52

依赖者: 0

建议者: 0

安全性: 0

星标: 5

关注者: 3

分支: 6

开放问题: 1

类型:mediawiki-extension

5.0.0 2024-04-02 20:18 UTC

This package is auto-updated.

Last update: 2024-09-02 21:06:25 UTC


README

DiscourseSsoConsumer 是一个 MediaWiki 扩展,允许 MediaWiki 站点通过 Discourse 讨论论坛进行用户身份验证,使用论坛的单点登录(SSO)提供者功能。本扩展旨在促进维基和讨论论坛之间的无缝集成。

DiscourseSsoConsumer 扩展本身是 MediaWiki 的 PluggableAuth 扩展的一个插件。

DiscourseSsoConsumer 的显著特性包括

  • 通过 Discourse 登录对维基用户进行身份验证;
  • 根据 Discourse 组设置维基用户权限;
  • 通过用户名或电子邮件将 Discourse 用户与现有维基用户关联,或在需要时创建新的维基用户;
  • 为关联用户提供对 Discourse 用户信息的访问;
  • 用户在维基和 Discourse 之间导航时的无缝身份验证;
  • “单点登出”(至少在一个方向上)。

由... CTAP

本扩展由 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命令
    $ 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
    
    如果您想锁定此扩展的主版本(以便未来的更新不会意外引入破坏性更改),将第一个命令更改为类似以下内容(例如,对于主要版本“194”)
    $ 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 settings image

全局登出的 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证书: 选中(推荐)
    • 激活: 选中
  • 点击保存并记住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参数:

有关后三个参数的更多详细信息,请参阅自动登录

使用钩子函数配置 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的真实姓名,默认情况下将更新账户的真实姓名。如果ExposeNametrue,Wiki真实姓名将设置为Discourse SSO凭证中的名称;如果false,Wiki真实姓名将设置为空字符串。

        无论如何,DiscourseSsoConsumer将控制用户的Wiki真实姓名。如果您希望DiscourseSsoConsumer不修改真实姓名,请参阅$wgPluggableAuth_EnableLocalProperties

    • ['User']['ExposeEmail']

      • 布尔值,默认值:false

      • 指定用户的电子邮件地址是否会被公开到MediaWiki。Discourse和MediaWiki的隐私控制不同,难以协调。如果Discourse站点的策略中电子邮件地址不是完全公开的,最好根本不要将其公开到MediaWiki。

        此设置会影响报告给PluggableAuth的电子邮件地址,默认情况下将更新账户的电子邮件地址。如果ExposeEmailtrue,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中的管理员状态设置用户的sysopbureaucrat组成员资格,并且不会影响任何其他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确实有“保持我登录”选项。然而

  1. 如果用户选择从Discourse登出,就没有好的方法来自动将用户从MediaWiki中登出。
  2. 如果禁用 $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

已知错误/问题

许可

本作品受GPL 3.0许可(或任何后续版本)的许可。

SPDX-License-Identifier: GPL-3.0-or-later

版权所有 2024 马特·马兰诺维奇