通过 Telegram 登录
XLADA 允许管理员使用 Telegram 账号登录面板。这样登录时 不需要密码:面板会把你带到 Telegram 页面,确认后 发放普通的 JWT 令牌。这便于日常工作,也 能防止密码被暴力破解。
通过 Telegram 登录仅限面板管理员登录。它与 订阅用户无关,并且与用于通知的机器人分开配置。
需要什么
配置位于面板的 Settings → Authentication → Telegram OAuth2 区域。需要四个值:
| 字段 | 是什么 |
|---|---|
| 启用 | 提供方开关 |
Client ID | Telegram 应用标识符 |
Client Secret | Telegram 应用密钥 |
Frontend Domain | 面板域名,不带 https://,例如 panel.example.com |
Allowed IDs | 管理员数字 Telegram ID 列表 |
Client ID 和 Client Secret 由 Telegram 为你的机器人签发——这是单独
的数据,不是 TELEGRAM_BOT_TOKEN 令牌。面板域名必须是真实的
FQDN:面板用它构造回调地址,且它必须与为机器人
注册的地址一致。
需要为机器人放行的回调地址:
https://panel.example.com/api/auth/oauth2/callback/telegram
请完整复制回调地址,连同 /api/auth/oauth2/callback/telegram。
如果只填写域名,Telegram 无法把你送回面板。
在 Allowed IDs 中添加管理员的数字 ID。该列表是必填的:只要
它为空,就无法启用提供方,任何人都无法登录。ID 是
数字,而不是用户名。
如果 Client ID、Client Secret 或
Frontend Domain 中哪怕有一项未填写,面板都不会启用 Telegram OAuth2。
请保存设置并立即检查登录,以免失去访问权限。
登录过程
- 你点击通过 Telegram 登录,面板会打开 Telegram 授权 页面。
- 面板发送
state和 PKCE 校验(code_verifier,S256 方法); 请求使用openid、profile和telegram:bot_access权限范围。 - Telegram 把授权码返回到回调地址——也就是
/api/auth/oauth2/callback/telegram。 - 面板校验
state和提供方,用授权码换取令牌,并从 ID 令牌中读取用户的数字 ID。 - 如果该 ID 在
Allowed IDs中,面板会发放超级管理员令牌, 并把成功登录写入日志。
确认后进入面板的是第一位管理员(超级管理员)。 其他管理员无法通过 Telegram 登录——这是有意为之。
限制
- 提供方仅通过 HTTPS 工作:没有带 TLS 的反向代理,面板本来也无法 启动。
Frontend Domain不带协议和路径。本地调试时 可以使用localhost和127.0.0.1。Allowed IDs是唯一的访问过滤器。如果列表为空或其中 有多余的 ID,不该进来的人也能登录。- 提供方可以与密码和其他登录方式一起启用——它们不会 冲突。
安全
面板通过多种机制保护登录:
state保存在 Valkey 中且有效期有限——没有它无法 伪造 Telegram 的响应;- 使用 PKCE,因此被截获的授权码无法变成令牌;
- 访问权由 ID 列表决定,而不是邮箱地址或姓名;
- 登录失败会以事件
service.login_attempt_failed记录, 并发送到 Telegram 和 Webhook; - 密码不会包含在这类通知中。
Client Secret 是完整的密钥。它保存在面板设置中,不会
以明文对外提供。不要公开它、不要在即时通讯中转发,
也不要保存在仓库中。一旦泄露,请在 Telegram 和设置中更换密钥。
如果你关闭了密码登录又失去了 Telegram 访问权限,紧急 CLI 可以帮你登录:它能够重新启用密码登录。