Multica Docs

登录与注册

配置验证码投递、Google 登录和新用户注册范围。

Multica 默认使用 6 位验证码登录,也可以增加 Google OAuth。已经存在的用户始终可以再次登录;注册限制只决定是否允许创建新账号。

验证码投递

用户输入邮箱后,Multica 会发送一个 6 位验证码。验证码 10 分钟内有效,验证成功后浏览器获得登录 cookie。

登录验证码也可以通过带签名校验的飞书自定义机器人发送。只要任一飞书配置存在,所有登录验证码就只会发送到飞书;配置不完整或发送失败时不会回退到邮件。两个飞书配置都为空时,验证码才会依次使用 SMTP、Resend。

使用带签名校验的飞书 Webhook

在接收消息的飞书群中创建自定义机器人并开启签名校验,然后同时设置:

MULTICA_VERIFICATION_FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
MULTICA_VERIFICATION_FEISHU_SIGN_SECRET=<签名密钥>

重启 API 服务。每条消息包含请求登录的邮箱、6 位验证码和 10 分钟有效期。任何能看到该群消息的人都能使用可见验证码登录对应邮箱,因此必须严格限制群成员。Webhook 地址和签名密钥都属于凭据,只能保存在服务端环境变量或密钥管理服务中。工作区邀请邮件仍使用 Resend 或 SMTP。

使用 Resend

  1. Resend 验证发信域名并创建 API key。
  2. 设置:
RESEND_API_KEY=re_xxxxxxxxxxxxxxxx
RESEND_FROM_EMAIL=[email protected]
  1. 重启 API 服务。

RESEND_FROM_EMAIL 必须属于已经在 Resend 验证的域名。

使用 SMTP

最少需要设置主机和发件地址:

SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=multica
SMTP_PASSWORD=<password>
SMTP_FROM_EMAIL=[email protected]

常见连接方式:

场景配置
内网匿名 relaySMTP_PORT=25,用户名和密码留空
STARTTLSSMTP_PORT=587,默认会在服务器支持时升级 TLS
隐式 TLSSMTP_PORT=465,或显式设置 SMTP_TLS=implicit

如果没有设置 SMTP_FROM_EMAIL,会回退到 RESEND_FROM_EMAIL。私有 CA 或自签证书需要把 CA 加入容器信任库;SMTP_TLS_INSECURE=true 会跳过证书校验,只应在可信内网中临时使用。

有些严格的 relay 还要求合法的 EHLO 名称:

SMTP_EHLO_NAME=mail.example.com

无验证码投递服务时的行为

服务器仍可启动,但未配置飞书、Resend 或 SMTP 时,验证码和邀请链接只会写入日志。这适合本地开发,不适合生产环境。

启动日志会说明验证码当前使用带签名的飞书 Webhook、Resend APISMTP relay 还是 DEV mode

本地固定验证码

本地自动化测试可以设置固定验证码:

APP_ENV=development
MULTICA_DEV_VERIFICATION_CODE=888888

验证码必须是 6 位数字。APP_ENV=production 时固定验证码会被忽略。

不要在公网实例中启用固定验证码。生产环境的组合是 APP_ENV=production 加空的 MULTICA_DEV_VERIFICATION_CODE

Google 登录

  1. Google Cloud Console 创建 OAuth 2.0 client。
  2. 把 Multica 前端的回调地址加入 Authorized redirect URIs
https://multica.example.com/auth/callback
  1. 设置:
GOOGLE_CLIENT_ID=xxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxx
GOOGLE_REDIRECT_URI=https://multica.example.com/auth/callback
  1. 重启 API 服务。

Google Console 与 GOOGLE_REDIRECT_URI 中的地址必须完全一致,包括协议、端口和结尾斜杠。配置生效后,登录页会出现 Google 登录按钮;前端镜像不需要重新构建。

注册范围控制

三个变量共同决定新账号能否创建:

变量作用
ALLOWED_EMAILS允许的完整邮箱,多个值用逗号分隔
ALLOWED_EMAIL_DOMAINS允许的邮箱域名,多个值用逗号分隔
ALLOW_SIGNUP未配置任何白名单时,是否允许注册;默认 true

判断顺序如下:

  1. 邮箱命中 ALLOWED_EMAILS,允许;
  2. 或域名命中 ALLOWED_EMAIL_DOMAINS,允许;
  3. 未命中时,如果 ALLOW_SIGNUP=false,拒绝;
  4. ALLOW_SIGNUP=true 但设置了任意白名单且未命中,仍然拒绝;
  5. 没有设置白名单且 ALLOW_SIGNUP=true,允许。

常见配置:

# 只允许公司域名
ALLOW_SIGNUP=false
ALLOWED_EMAIL_DOMAINS=company.com

# 再放行一位外部协作者
ALLOWED_EMAILS=[email protected]

两个白名单在 ALLOW_SIGNUP=false 时也可以作为明确的例外名单。

邀请与注册限制

邀请不会自动绕过注册限制:

  • 对方已经有 Multica 账号时,可以登录并接受邀请;
  • 对方还没有账号时,邮箱必须符合上面的注册规则。

在关闭开放注册的实例中邀请新成员时,先把对方邮箱加入 ALLOWED_EMAILS。账号创建并接受邀请后,可以再从名单中移除。

登录有效期

浏览器登录默认保持 30 天。可以用 AUTH_TOKEN_TTL 调整,支持 Go duration 或正整数秒数:

AUTH_TOKEN_TTL=720h

修改后需要重启 API 服务。这个值只影响之后签发的登录 cookie 和 JWT,不会延长已经签发的令牌。

接下来