跳转到内容

邮件与 OAuth2

邮件登录和 OAuth2 provider 都通过 runtime settings 配置。邮件使用 email 分组,OAuth2 provider 使用 oauth2.providers

邮件配置存储在 PostgreSQL,并在集群节点间热更新:

终端窗口
synctv settings update \
--set email.smtpHost=smtp.example.com \
--set email.smtpPort=465 \
--set 'email.smtpCredentials={"username":"synctv@example.com","password":"secret"}' \
--set 'email.smtpProxy={"url":"socks5://proxy.example.com:1080"}' \
--set email.useTls=true \
--set email.fromEmail=synctv@example.com \
--set email.fromName=SyncTV \
--set email.enabled=true
字段 默认值 作用
email.enabled false 启用邮件发送
email.smtpHost null SMTP 服务器地址
email.smtpPort 587 SMTP 端口
email.smtpCredentials null 可选 SMTP 登录凭据 {username, password}
email.smtpProxy null 可选 SOCKS5 代理 {url, credentials?}
email.fromEmail null 发件邮箱,启用邮件时必须是合法地址
email.fromName SyncTV 发件人显示名
email.useTls true 是否使用 TLS 连接 SMTP

updateMask 指定需要覆盖的字段。清除 smtpHostfromEmailsmtpCredentialssmtpProxy 时,在 updateMask 中保留对应路径,并在 settings.email 中省略该字段。管理读取接口返回用户名和代理 URL,并省略密码。保留相同用户名且省略 password 时沿用现有密码;新凭据和用户名变更需要提供密码。代理负责解析 SMTP 目标域名。邮件验证码、密码重置、邮件 MFA 都依赖这组 SMTP 配置。独立邮箱登录只服务已有账号;请求验证码接口会返回统一文案,避免泄露邮箱是否已注册。邮件注册是否开放、是否需要审核见 运行时设置

oauth2.providersOAuth2ProviderSettings 数组。每个元素的 instanceName 是 provider 实例名,例如 githublogto1corp_oidc。实例名只能包含 ASCII 字母、数字、_-

每个实例使用共享字段加一个 provider oneof 字段:

{
"instanceName": "github",
"enableSignup": true,
"signupNeedReview": false,
"github": {
"clientId": "github-client-id",
"clientSecret": "github-client-secret"
}
}

字段含义:

字段 作用
instanceName provider 实例名
enableSignup 是否允许这个 provider 的首次登录自动创建本地账号
signupNeedReview 首次登录是否进入注册审核
provider oneof 字段 qqgithubgooglemicrosoftdiscordcasdoorlogtooidcfeishugiteeapple。每个对象内写 provider 私有字段
[
{
"instanceName": "github",
"enableSignup": true,
"signupNeedReview": false,
"github": {
"clientId": "github-client-id",
"clientSecret": "github-client-secret"
}
}
]
  • 运行时 settings 修改后,OAuth2 服务会按新配置重建 provider map。
  • 缺失某个实例名,就等于这个入口不可用。
  • enableSignup=false 只影响首次 OAuth2 建号,不影响已绑定账号登录。
  • signupNeedReview=true 会把首次 OAuth2 注册送入审核流程。

浏览器授权请求传入 redirectUrl,服务端使用 oauth2.allowedRedirectUrls 校验 HTTPS 回调地址,loopback 回调单独放行。客户端应在每次授权开始时生成或选择当前回调地址,并在第三方平台注册相同地址。

原生授权请求省略 redirectUrl,并传入 native=true。Apple provider 通过 supportedModes 声明原生能力;iOS 和 Mac App Store 构建通过系统 Sign in with Apple 返回 authorization code,客户端随后把 code 和 state 交给 SyncTV 服务端交换。macOS Developer ID 构建使用浏览器授权流程。服务端会拒绝 provider 未声明的模式。

Apple 原生登录不使用 /.well-known/apple-app-site-association。该文件属于 Apple Universal Links、浏览器 OAuth 回调关联和 Passkey 关联。

所有 provider secret 都放在 provider 配置中,并通过 runtime settings 管理。Apple 使用 webClientSecretnativeClientSecret 两个独立 secret。