以编程方式创建带有 OAuth2 用户 ID 的用户

是否可以通过 REST API 在 user_associated_account 表中插入一行?

为了提供一些背景信息,我需要在我们的 Discourse 实例中创建用户,并将他们链接到我们的 OAuth2 提供商。当用户通过 Discourse UI(使用 OAuth2 Basic 插件)登录时,他们的账户会被自动链接,我可以通过 GET /u/by-external/oauth2_basic/{external_uid} 接口,根据外部 UID 获取对应的 Discourse 用户 ID。

然而,当我们通过 REST API(POST /users.json)创建用户时,似乎没有方法将他们的账户与对应的 OAuth2 账户关联起来(除非他们手动在 Discourse 上登录)。

附注:OAuth2 Basic 插件已实现新的 Auth::ManagedAuthenticator 系统:https://github.com/discourse/discourse-oauth2-basic/pull/21

我尝试过以下方法:

  • 查阅了 API 文档,但未找到任何线索。
  • 找到了用于获取某个用户关联账户的 API 路由:GET /u/{username}/emails.json。但该路由似乎不支持 HTTP PUT 方法,也未暴露 user_associated_accounts 表中的字段(provider_nameprovider_uiduser_id)。
  • 我还检查了 Discourse 设置,看是否有与此问题相关的配置,但未成功。
  • 我在 meta.discourse.org 上查找过,也未找到解决方案。

非常感谢您的任何帮助!谢谢 :slight_smile:

只要您使用 OAuth 提供的相同电子邮件地址创建用户,就无需担心。

1 个赞

感谢您的反馈!
我本不想为此担心,但我需要能够通过我的提供商 ID 获取用户信息(GET /u/by-external/oauth2_basic/{external_uid})。
目前,除非用户通过 UI 手动登录(我想避免这种情况),否则无法实现这一功能。

我在创建新用户时,会考虑这样暴露 associated_accounts

POST /users.json
{
  username: "something",
  email: "test@test.com",
  associated_accounts: [
    {
      provider_name: "oauth2_basic",
      provider_uid: "12345"
    }
  ]
}

这样完美!

注意:这与 Gitlab 用户 API 中的 providerextern_uid 参数类似(Users API | GitLab Docs