Discord的Token、User ID、Channel ID等标识是如何生成的?
Discord ID体系与非2FA账号Token生成实现参考
1. ID标识体系(User ID、Channel ID等)
Discord的全类型资源ID采用自定义雪花算法变种生成,是公开可复现的分布式全局唯一ID方案,结构如下(64位正整数):
- 1位最高位:固定为0,保证所有ID为正整数
- 42位时间戳:单位为毫秒,使用Discord自定义纪元(2015-01-01 00:00:00 UTC)作为起始时间,最多可支持到2087年的ID生成
- 5位工作节点ID + 5位数据中心ID:最多支持1024个分布式节点同时生成ID
- 12位序列号:单节点同毫秒内最多生成4096个不重复ID
复现时只需要将自定义纪元替换为你的平台上线时间,其余逻辑可以完全复用该结构,即可实现和Discord完全一致的ID特性:支持全局唯一、可反推资源创建时间、排序时天然按照创建时间升序排列。
2. 非2FA场景下Account Token生成逻辑
目前通过逆向工程已经明确非2FA场景的Discord Token为三段式.分隔字符串,生成逻辑可直接复现:
- 第一段:将用户ID转为字符串后做
Base64编码,去掉末尾的=填充字符即可 - 第二段:将Token生成时间的时间戳(按你自己的业务规则取精度,一般为秒或毫秒)做
Base64编码,同样去掉末尾=填充,你也可以在这一段加入自定义的版本标识、权限等级字段,转成字节后再编码 - 第三段:服务端使用仅内部留存的密钥,对前两段拼接后的字符串做
HMAC-SHA256签名,取签名结果的前27个字符做Base64编码,去掉填充后得到
Token校验逻辑不需要依赖数据库存储:服务端收到用户提交的Token后,拆分出前两段,用本地密钥重新生成签名,和第三段做比对即可验证合法性,校验效率极高。如果需要实现Token过期机制,只需要从第二段解析出生成时间,和当前时间比对超过有效期则直接拒绝即可。
目前主流的Discord机器人开发SDK中都包含了ID、Token的本地校验逻辑,可以直接参考这类开源库的对应实现部分。
内容的提问来源于stack exchange,提问作者Johnty
相关产品推荐
相关产品推荐

