三年前,我在做氧化世界的时候谈道,用 WordPress 组建社区门户,并让用户在社区门户完成账户注册、登录和管理。至于 Minecraft 游戏内登录服务器,当时联动门户账户的方法是使用 AuthMe Reloaded 插件,通过直接连接服务器数据库,设置单向加盐算法,让插件直接对比数据表列的账户名和密码进行登录验证。
往后氧化世界虽然被 DDoS 锤爆了,但 AuthMe 配置文件送给了许多友商,现在他们也都在用同一套方案组建社区门户。用了这么长时间,方案的缺陷已经人尽皆知。首先,服务端插件验证账户必须直连 MySQL 数据库,使得部署 WordPress 实例的服务器必须对外开放端口,增加了端口扫爆的风险;其次,AuthMe 直连数据库会获取数据库的读写权限,在操作不当的情况下(尤其是权限分配有误)可以绕开 WordPress 直接修改数据库内容,增删账户甚至读数据表列,属于安全风险。
为解决上述问题,我把目光投向了 LittleSkin 等提供第三方登录的皮肤站,他们会使用名为 Yggdrasil 的协议(https://minecraft.wiki/w/Yggdrasil),让用户把登录 MOJANG 的数据“转发”到自己部署的验证服务器,模拟验证响应,从而实现用户端第三方登录。这种方式只需要验证服务器暴露 API 端点,用户端和服务端均无需侵入式访问 MySQL 资源,验证处理流程由后端完成不暴露给用户,安全性会有所提升。且自部署 Yggdrasil 的情况下可以搭配其他插件(诸如 MultiYggdrasil)实现正版登录和第三方登录共存。
由于氧化世界这种门户已经建立在 WordPress 实例之上,现在要实现 Yggdrasil 我认为最简便的方案是制作一个 WordPress 插件,并在 REST API 上模拟 AuthServer 和 SessionServer 响应。账户密码验证和数据库操作全部由 WordPress 接管,可控且较为安全。于是便做了一个兼容层框架,用于在 WordPress 模拟 Yggdrasil 验证服务器工作流程,供参考交流使用。
插件在首次安装后,会在当前 WordPress 实例创建 ygg_tokens 和 ygg_joins 数据表,用于模拟 Yggdrasil 会话。插件启用时,会在 WordPress REST API 提供 /yggdrasil/v1 接口,模拟 Yggdrasil 接入点,提供 AuthServer 和 SessionServer 服务。使用此 REST API 可完成 Yggdrasil 登录和会话流程。拼接后接口端点示例:
https://example.com/wp-json/yggdrasil/v1
用户使用此 WordPress 实例上的用户名和密码,可完成 Minecraft 第三方登录。游戏资料名默认为用户名(非昵称),默认只模拟一个资料账户,暂不支持增添,暂不支持设置皮肤。
欢迎提出建议并帮助改进框架。







之前开服的时候,用过QQ机器人登录绑定用户的插件。