| 摘要 | Discourse OAuth2 Basic 支持基础的 OAuth2 提供商,前提是这些提供商拥有可通过令牌获取用户详情的 JSON API 端点。 | |
| 安装指南 | 此插件已随 Discourse 核心捆绑。无需单独安装该插件。 |
功能
此插件允许您使用基础的 OAuth2 提供商作为 Discourse 的身份验证方式。它应能与许多提供商配合使用,但前提是它们必须提供用于检索登录用户信息的 JSON 端点。
这对于使用不太流行的登录提供商的用户特别有用。如果您想使用 Google、Facebook 或 Twitter,这些已内置于系统中,无需此插件。您也可以在我们的 GitHub 仓库 中查找其他登录提供商。
配置
基础配置
- 首先,向您的 OAuth2 提供商注册您的 Discourse 应用程序。它将需要一个重定向 URI,格式如下:
http://DISCOURSE_HOST/auth/oauth2_basic/callback
将
DISCOURSE_HOST替换为相应的值,并确保如果启用了https则使用https。OAuth2 提供商应为您提供client ID和secret,以及几个 URL。
- 访问您的 管理后台 → 设置 → OAuth2 登录,并填写 OAuth2 提供商的基础配置:
oauth2_enabled- 勾选此项以启用该功能oauth2_client_id- 来自提供商的客户端 IDoauth2_client_secret- 来自提供商的客户端密钥oauth2_authorize_url- 提供商的授权 URLoauth2_token_url- 提供商的令牌 URL。
如果您无法确定上述设置的值,请查阅提供商的开发文档或联系其客户支持。
配置 JSON 用户端点
现在 Discourse 可以接收来自 OAuth2 提供商的授权令牌。不幸的是,Discourse 还需要更多信息才能完成身份验证。
我们需要一个 API 端点,以便根据令牌检索用户信息。
例如,OAuth2 提供商 SoundCloud 提供了这样的 URL。如果您拥有 SoundCloud 的 OAuth2 令牌,可以向 https://api.soundcloud.com/me?oauth_token=A_VALID_TOKEN 发送 GET 请求,并将返回包含用户信息的 JSON 对象。
要在 Discourse 上配置此功能,我们需要设置 oauth2_user_json_url 设置的值。在这种情况下,我们将输入以下值:
https://api.soundcloud.com/me?oauth_token=:token
其中 :token 部分告诉 Discourse 需要在身份验证完成后用其收到的授权令牌替换该值。
最后一步是告诉 Discourse JSON 中可用的属性有哪些。以下是 SoundCloud 的示例响应:
{
"id": 3207,
"permalink": "jwagener",
"username": "Johannes Wagener",
"uri": "https://api.soundcloud.com/users/3207",
"permalink_url": "http://soundcloud.com/jwagener",
"avatar_url": "http://i1.sndcdn.com/avatars-000001552142-pbw8yd-large.jpg?142a848",
"country": "Germany",
"full_name": "Johannes Wagener",
"city": "Berlin"
}
oauth2_json_user_id_path、oauth2_json_username_path、oauth2_json_name_path 和 oauth2_json_email_path 变量应设置为指向 JSON 中相应的属性。
唯一必需的属性是 id —— 我们需要它以便在用户未来登录时能够找到正确的账户。其他属性如果可用也非常有用 —— 它们可以加快用户的注册流程,因为这些信息将自动填充到表单中。
以下是我配置 JSON 路径设置的方式:
oauth2_json_user_id_path: 'id'
oauth2_json_username_path: 'permalink'
oauth2_json_name_path: 'full_name'
我使用了 permalink,因为它似乎比 JSON 中的 username 更符合 Discourse 对用户名格式的预期。请注意,我省略了邮箱路径:SoundCloud 不提供邮箱,因此用户首次注册 Discourse 时必须自行提供并验证邮箱。
如果您希望从 JSON 对象中获取的属性是嵌套的,可以使用点号。例如,如果 API 返回了如下不同的结构:
{
"user": {
"id": 1234,
"email": {
"address": "test@example.com"
}
}
}
您可以使用 user.id 作为 oauth2_json_user_id_path,使用 user.email.address 作为 oauth2_json_email_path。
如果键本身包含点号,则需要用双引号将其括起来,或者使用反斜杠转义点号。例如,给定以下 JSON:
{
"example.com/uid": "myuid"
}
您可以将路径指定为 example\.com/uid 或 "example.com/uid"。
如果您设置了
oauth2_json_email_path,OAuth2 提供商 必须 确认用户确实拥有该邮箱地址。 否则可能导致 Discourse 账户被接管!
由我们托管?此插件可在我们的商业版和企业版计划中使用。OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion
需要自动化用户注册?请参阅 Auto-provisioning user accounts when SSO is enabled