社交登录
Artalk 默认只需填写昵称和邮箱即可发表评论,无需验证邮箱。
但有时候,我们希望用户能够使用社交账号登录,以减少用户填写信息的时间,或者提高用户信息的真实性,可以通过启用社交登录来实现这一目的。
社交登录目前支持以下多种方式:
| 登录方式 | 接入文档 | 登录方式 | 接入文档 | 登录方式 | 接入文档 |
|---|---|---|---|---|---|
| 查看 | Microsoft | 查看 | Apple | 查看 | |
| 查看 | 查看 | Discord | 查看 | ||
| Slack | 查看 | Github | 查看 | Tiktok | 查看 |
| Steam | 查看 | 查看 | Line | 查看 | |
| GitLab | 查看 | Gitea | 查看 | Mastodon | 查看 |
| Patreon | 查看 | Auth0 | 查看 | 邮箱密码 | 查看 |
开启社交登录功能仅需在 控制中心 找到「社交登录」启用该功能,然后填写对应的配置信息即可。也可以通过 配置文件 或 环境变量 进行配置。
邮箱密码登录

启用邮箱密码登录后,评论框顶部的昵称邮箱输入框将被隐藏,发送按钮将显示为登录按钮。用户点击登录按钮后,将会弹出一个登录框,用户可以输入邮箱和密码登录,登录成功后即可发表评论。并且,用户发表的评论将展示「邮箱已验证」的标识。

用户可以通过邮箱注册账号,Artalk 将向用户邮箱发送一封带有验证码的邮件。验证码有效期为 10 分钟,验证码发送频率限制为 1 分钟一次。

支持自定义验证码邮件模板和邮件标题,可在 Artalk 控制中心的设置页面的社交登录找到「邮箱验证邮件标题」、「邮箱验证邮件模板」选项进行设置。在配置文件中,可以通过 auth.email.verify_subject 和 auth.email.verify_tpl 进行设置:
auth:
enabled: true
email:
enabled: true
verify_subject: "您的验证码是 - {{code}}"
verify_tpl: default默认模版如下:
您的验证码是:{{code}}。请使用它来验证您的电子邮件并登录到 Artalk。如果您没有请求此操作,请忽略此消息。
启用邮箱密码登录功能后,仍然可跳过邮箱验证:登录弹窗底部显示 “跳过,不验证” 按钮,点击后评论框顶部恢复为显示原有的昵称、邮箱、网址三个输入框。在设置中勾选「允许匿名评论」可以更改。
账号合并工具
登录后如果检测到相同的邮箱下有多个不同用户名的账号,将会弹出账号合并工具,用户可以选择保留其中一个用户名,该邮箱下的所有评论等数据合并到保留的账号下。原有的账号将被删除,评论显示的用户名将会变更为保留的用户名。

多种登录方式
Artalk 支持同时启用多种登录方式,用户可以选择任意一种方式登录。

如果只启用了唯一一种登录,例如 GitHub 登录,将直接弹出 GitHub 的授权登录页面。

接入 GitHub 登录可参考文档:关于创建 GitHub 应用,得到 Client ID 和 Client Secret 后,填写到 Artalk 控制中心的设置页面的社交登录中的「GitHub」选项中即可。
SSO 令牌交换
如果你的站点被嵌入在一个已经通过外部 OIDC 身份提供商(Auth0、Keycloak、Okta 等)完成用户认证的应用中,可以让 Artalk 复用该登录态,而不必显示自己的登录界面。外层应用用它已经持有的 IdP 访问令牌换取一个 Artalk 会话令牌,这样已在父应用登录的用户无需额外点击或弹窗即可发表评论。
该功能默认关闭,需手动开启。可通过 配置文件 或 环境变量 启用,并填写你所用提供商的 OIDC issuer:
auth:
enabled: true
sso:
enabled: true
issuer: "https://tenant.auth0.com" # 例如 "tenant.auth0.com" 或 "https://tenant.auth0.com"启用后,外层应用将 IdP 访问令牌提交到交换接口:
POST /api/v2/sso/exchange
Content-Type: application/json
{ "token": "<外部 IdP 访问令牌>" }Artalk 通过调用 issuer 的 /userinfo 端点校验该令牌(OIDC 标准做法——由 IdP 在服务端验证并签名响应,因此 Artalk 侧无需处理密钥),读取其中的 email 声明,查找或创建对应用户,并返回与其它登录接口一致的响应结构:
{
"token": "<Artalk 会话令牌>",
"user": { "name": "...", "email": "...", "is_admin": false }
}前端在 Artalk.init() 运行前将其写入 localStorage["ArtalkUser"],组件即把该用户视为已完全登录(不弹窗,管理员用户也不再要求输入管理密码):
const res = await fetch('https://comments.example.com/api/v2/sso/exchange', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: idpAccessToken }), // 来自你的 IdP 的访问令牌
})
const { token, user } = await res.json()
// 在组件挂载前预填 Artalk 登录态
localStorage.setItem('ArtalkUser', JSON.stringify({ ...user, token }))
Artalk.init({ el: '#Comments', server: 'https://comments.example.com', site: 'Blog' })当 SSO 未启用时接口返回 404,IdP 拒绝令牌时返回 401,令牌不含邮箱声明时返回 400。
TIP
校验完全依赖 issuer 的 /userinfo 拒绝无效或已吊销的令牌,且用户按 email 声明匹配。请仅对你信任的 issuer 启用此功能,并确保该 issuer 返回的是已验证的邮箱。
插件开发
Artalk 的社交登录功能是通过独立的插件实现并采用 Solid.js 开发,代码可在 @ArtalkJS/Artalk:ui/plugin-auth 找到。
在控制中心启用社交登录功能后,将自动在前端加载该插件。
贡献者
qwqcode