# OpenID Connect (OIDC) GoToSocial 支持 [OpenID Connect](https://openid.net/connect/),这是一种基于 [OAuth 2.0](https://oauth.net/2/) 构建的身份验证协议,OAuth 2.0 是授权协议的行业标准协议之一。 这意味着你可以将 GoToSocial 连接到外部 OIDC 提供商,如 [Gitlab](https://docs.gitlab.com/ee/integration/openid_connect_provider.html)、[Google](https://cloud.google.com/identity-platform/docs/web/oidc)、[Keycloak](https://www.keycloak.org/) 或 [Dex](https://dexidp.io/),并允许用户使用其凭据登录 GoToSocial。 在以下情况下,这非常方便: - 你在一个平台上运行多个服务(Matrix、Peertube、GoToSocial),并希望用户可以使用相同的登录页面登录所有服务。 - 你希望将用户、账户、密码等的管理委托给外部服务,以简化管理。 - 你已经在外部系统中有很多用户,不想在 GoToSocial 中手动重新创建他们。 !!! tip 如果用户尚不存在,且你的 IdP 没有返回非空的 `email` 作为 claims 的一部分,登录将会失败。这个 email 需要在此实例中是唯一的。尽管我们使用 `sub` claim 将外部身份与 GtS 用户关联,但创建用户时需要一个与之关联的 email。 ## 设置 GoToSocial 为 OIDC 提供以下配置设置,以下显示的是其默认值。 ```yaml ####################### ##### OIDC CONFIG ##### ####################### # 配置与外部 OIDC 提供商(如 Dex、Google、Auth0 等)的身份验证。 # 布尔值。启用与外部 OIDC 提供商的身份验证。如果设置为 true,则其他 OIDC 选项也必须设置。 # 如果设置为 false,则使用标准的内部 OAuth 流程,用户使用用户名/密码登录 GtS。 # 选项: [true, false] # 默认值: false oidc-enabled: false # 字符串。oidc idp(身份提供商)的名称。这将在用户登录时显示。 # 示例: ["Google", "Dex", "Auth0"] # 默认值: "" oidc-idp-name: "" # 布尔值。跳过对从 OIDC 提供商返回的令牌的正常验证流程,即不检查过期或签名。 # 这应仅用于调试或测试,绝对不要在生产环境中使用,因为这极其不安全! # 选项: [true, false] # 默认值: false oidc-skip-verification: false # 字符串。OIDC 提供商 URI。这是 GtS 将用户重定向到的登录地址。 # 通常这看起来像是一个标准的网页 URL。 # 示例: ["https://auth.example.org", "https://example.org/auth"] # 默认值: "" oidc-issuer: "" # 字符串。在 OIDC 提供商处注册的此客户端的 ID。 # 示例: ["some-client-id", "fda3772a-ad35-41c9-9a59-f1943ad18f54"] # 默认值: "" oidc-client-id: "" # 字符串。在 OIDC 提供商处注册的此客户端的密钥。 # 示例: ["super-secret-business", "79379cf5-8057-426d-bb83-af504d98a7b0"] # 默认值: "" oidc-client-secret: "" # 字符串数组。向 OIDC 提供商请求的范围。返回的值将用于填充在 GtS 中创建的用户。 # 'openid' 和 'email' 是必需的。 # 'profile' 用于提取新创建用户的用户名。 # 'groups' 是可选的,可以用于根据 oidc-admin-groups 确定用户是否为管理员。 # 示例: 见 eg., https://auth0.com/docs/scopes/openid-connect-scopes # 默认值: ["openid", "email", "profile", "groups"] oidc-scopes: - "openid" - "email" - "profile" - "groups" # 布尔值。将通过 OIDC 进行身份验证的用户与现有用户基于其电子邮件地址进行关联。 # 这主要用于迁移目的,即从使用不稳定 `email` claim 进行唯一用户标识的旧版 GtS 迁移。对于大多数用例,应设置为 false。 # 选项: [true, false] # 默认值: false oidc-link-existing: false # 字符串数组。如果返回的 ID 令牌包含与 oidc-allowed-groups 中的某个组匹配的 'groups' claim,则该用户将在 GtS 实例上被授予访问权限。 # 如果数组为空,则授予所有组权限。 # 默认值: [] oidc-allowed-groups: [] # 字符串数组。如果返回的 ID 令牌包含与 oidc-admin-groups 中的某个组匹配的 'groups' claim,则该用户将在 GtS 实例上被授予管理员权限。 # 默认值: [] oidc-admin-groups: [] ``` ## 行为 在 GoToSocial 上启用 OIDC 后,默认登录页面会自动重定向到 OIDC 提供商的登录页面。 这意味着 OIDC 本质上 *替代* 了正常的 GtS 邮箱/密码登录流程。 由于 ActivityPub 标准的工作方式,你 _不能_ 在设置用户名后更改它。这与 OIDC 规范冲突,该规范不保证 `preferred_username` 字段是稳定的。 为了解决这个问题,我们要求用户在首次登录尝试时提供用户名。此字段预先填入 `preferred_username` claim 的值。 在认证后,GtS 存储由 OIDC 提供商提供的 `sub` claim。在后续的身份验证尝试中,这个 claim 被用作唯一的用户查找方式。 这使你可以在提供商级别更改用户名而不丢失对 GtS 账户的访问。 ### 群组成员身份 大多数 OIDC 提供商允许在返回的 claims 中包含群组和群组成员身份的概念。GoToSocial 可以使用群组成员身份来确定从 OIDC 流中返回的用户是否应创建为管理员账户。 如果返回的 OIDC 群组信息中包含配置在 `oidc-admin-groups` 中的群组成员身份,则该用户将被创建/登录为管理员。 ## 从旧版本迁移 如果你从使用不稳定 `email` claim 进行唯一用户标识的旧版 GtS 迁移过来,可以将 `oidc-link-existing` 配置设置为 `true`。如果无法为提供商返回的 ID 找到用户,则会根据 `email` claim 进行查找。如果成功,稳定 ID 将被添加到匹配的用户数据库中。 你应仅在有限时间内使用此功能,以避免恶意账户盗取。 ## 提供商示例 ### Dex [Dex](https://dexidp.io/) 是一个可以自行托管的开源 OIDC 提供商。安装 Dex 的过程不在本文档范围内,你可以在 [这里](https://dexidp.io/docs/) 查看 Dex 文档。 Dex 的优势在于它也用 Go 编写,像 GoToSocial 一样,这意味着它体积小、运行快,在低功耗系统上也能很好地运行。 要配置 Dex 和 GoToSocial 一起工作,在 Dex 配置的 `staticClients` 部分创建以下客户端: ```yaml staticClients: - id: 'gotosocial_client' redirectURIs: - 'https://gotosocial.example.org/auth/callback' name: 'GoToSocial' secret: 'some-client-secret' ``` 确保将 `gotosocial_client` 替换为你想要的客户端 ID,并将 `secret` 替换为一个合理长且安全的密钥(例如 UUID)。你还应该将 `gotosocial.example.org` 替换为 GtS 实例的 `host`,但保留 `/auth/callback` 不变。 然后,编辑 GoToSocial config.yaml 中的 `oidc` 部分如下: ```yaml oidc: enabled: true idpName: "Dex" skipVerification: false issuer: "https://auth.example.org" clientID: "gotosocial_client" clientSecret: "some-client-secret" scopes: - "openid" - "email" - "profile" - "groups" ``` 确保将 `issuer` 变量替换为你的 Dex 提供商设置。这应该是你的 Dex 实例的可访问到的确切 URI。 现在,重启 GoToSocial 和 Dex,以便新设置生效。 当你下次登录 GtS 时,你应该会被重定向到 Dex 的登录页面。登录成功后,你将返回到 GoToSocial。