Minecraft【外置登录】利用 Blessing Skin 皮肤站的 Yggdrasil API 插件实现外置登录功能

不知道诸君对 Minecraft 的正版登录系统(Yggdrasil API)有多少了解呢?

前言

现在国内绝大多数运作于离线模式(online_mdoe=false)下的服务器都是使用的 Authme、CrazyLogin 等登录插件,也就是进入服务器之后再进行认证(e.g. /login )的内置登录系统。虽然这样进入了服务器再登录的机制在小型服务器上没什么问题,但是服务器人一多,就容易出现各种各样的隐患了(假人、未登录也能发送指令 etc.),相信这方面各位腐竹都比较了解。

用过 Minecraft 正版登录的同学应该都知道,正版 Minecraft 是在进入游戏之前就要在【启动器】中进行登录操作的,而且只有登录之后你才能进入开了正版验证的服务器(online_mode=true)中游玩,否则是连服务器都进不去的。

目前也有很多第三方开发的【外置登录系统】都在尝试实现 Minecraft 正版登录的这一效果,这些软件无不都是将【登陆鉴权】这一操作从【进入服务器后】提到了【启动游戏前】来,配合服务端插件使用,在启动器中就是用账号密码登录后,启动游戏就可以直接进入服务器开玩了,比起 Authme 那样进入服务器还要输入指令登录不知道高到哪里去了。

这也是为什么软件开发版中那些「外置登录系统」很受欢迎的原因(包括不限于 MadAuth、WebLogin、BeeLogin、WebRegister、冰棂登陆系统),这样不仅提升了玩家的游戏体验以及服务器的安全性,还顺带能有一个「服务器专用启动器」,逼格不是高了一点半点(笑)

其实这些软件的原理就是将原本的登录鉴权这一步骤从游戏里抽出来了,将其放到启动器 or 网页上去,而服务端插件的功能就只剩下「查询数据库中用户的登录状态,决定是否放行」:

Minecraft【外置登录】利用 Blessing Skin 皮肤站的 Yggdrasil API 插件实现外置登录功能

这样也没什么不好的,不是吗?那我今天要介绍的这种方法和那些「外置登录系统」有什么差别呢?

实现原理

其实说到底,那些「外置登录系统」都是致力于实现和 Mojang 官方的正版登录类似的体验(启动器中登录,启动游戏后直接就能进入服务器)。那么我们为何不来个大胆的想法,让 Mojang 那套正版登录的鉴权系统为我们所用?

这里必须要感谢 @yushijinhun 开发的 authlib-agent,正是因为有了这个开源项目,本帖所描述的方案才得以实现。

authlib-agent 是啥呢?简单来说,用了这玩意就可以把 Minecraft 内部写死的 Mojang 官方正版登录 API(也就是 Yggdrasil API)的地址给替换成自定义的地址(ASM 字节码替换),从而实现了和正版登录一样的功能:

  • 游戏外登录验证;
  • 对皮肤及披风的支持;
  • 对绝大多数客户端,服务端,启动器的支持(要求 JVM 语言编写,MC 1.7+);
  • 跨平台;

是不是很屌呢?如果你还是没听懂上面我讲的是什么鬼,那我就说得更通俗一些:

我们可以把 Mojang 官方正版登录的 API 【劫持】成我们自己的啦!

那么劫持之后能实现什么效果呢?

可以实现几乎和 Mojang 官方正版登录一样的效果。可以说,官方的正版登录有什么功能,使用 authlib-agent 后就能实现什么功能,甚至比 Mojang 官方的功能更多(e.g. 单用户多角色)。

不过这个方法只有唯一的一个弊端:

我们【劫持】了 Mojang 官方的 API,那也就意味着我们必须要实现一个和官方 Yggdrasil API 功能一模一样的 API。因为 authlib-agent 能做的只有替换掉 API 地址,至于我们的第三方 API,那就得靠我们自己去写代码实现了。

我相信,这对于绝大多数的同学都是非常痛苦的,你又要去查阅 Yggdrasil API 的文档(还没有提到很多自己实现时可能遇到的坑),还要从头开始写一个用户管理系统、角色系统、皮肤系统(上传管理、皮肤广场 etc.)、管理后台……天哪,这太可怕了!

虽然 @yushijinhun 同时也提供了一套他自己开发的 Yggdrasil API 后端实现,但是说实话那个太 简 陋 了,远远达不到实际生产应用的标准(只有一套 RESTful API,没有前端界面,也只有基础功能),所以我相信大部分同学想要在服务器上部署 authlib-agent 的时候还是有些顾虑的。

那么现在,终于到了我发这个帖子的目的所在了。

实现效果

不知道现在正在阅读此贴的各位有没有听说过 Blessing Skin 这个皮肤站程序呢?

如果有,那事情就好说了。虽然重头开发一套 Yggdrasil API 的杂七杂八系统很够呛,但是幸运的是,我之前一直有在维护 Blessing Skin 这个皮肤站程序,并且在 v3 版本后,皮肤站全面支持的「单用户多角色」功能,再加上皮肤站本身就很完善的角色管理、皮肤上传与分享、后台管理等等功能,这也就意味着,我们可以直接使用皮肤站的用户系统,在此基础上实现一个第三方的 Yggdrasil API。

更幸运的是,今年初的时候我给 Blessing Skin 加上了【插件系统】(v3.2+),这也就意味着,我可以在完全不修改皮肤站现有源代码的情况下,以【插件】的形式提供一个 Yggdrasil API 服务。

废话不多说,先看效果:

Minecraft【外置登录】利用 Blessing Skin 皮肤站的 Yggdrasil API 插件实现外置登录功能

▲在皮肤站「角色管理」中可添加多个角色Minecraft【外置登录】利用 Blessing Skin 皮肤站的 Yggdrasil API 插件实现外置登录功能

▲使用皮肤站的邮箱与密码登录后,配合 HMCL 实现多角色选择Minecraft【外置登录】利用 Blessing Skin 皮肤站的 Yggdrasil API 插件实现外置登录功能

▲游戏内的显示效果,无需皮肤 Mod 即可加载皮肤站中设定好的皮肤 & 披风,甚至能够实现原本只有正版登录才能实现的 TAB 栏头像显示哦

部署方法

看到上面的截图有没有心动呢?
下面献上部署方法:

  1. 安装好 Blessing Skin 皮肤站;
  2. 安装皮肤站的 Yggdrasil API 插件(如何安装插件?);
  3. 在管理后台启用刚才安装的「Yggdrasil API」插件;
  4. 下载 authlib-agent 源码(具体教程看 @yushijinhun 的 原贴);
  5. 编译 authlib-agent 时将配置文件中的 API 地址修改为 {你的皮肤站地址}/api/yggdrasil/ 并且将你的皮肤站域名加入 authlib 白名单(不然加载不了皮肤);
  6. 正确地给【启动器】、【游戏】、【服务器】三者都加载上编译好的 authlibagent.jar,三者缺一不可(否则会造成无法登录服务器,具体如何加载自己去看 authlib-agent 原贴);
  7. 完成。

看起来很麻烦,是吗?

但是如果你耐心部署完后,你就能得到以下功能:

  1. 一个完善的账号系统(配合数据对接插件还能与 Discuz 等论坛账号互通),包括友好的注册、登录网页界面以及强大的管理员面板,在管理后台中封禁用户后,该用户也将无法登录游戏;
  2. 一个皮肤管理系统,自带皮肤库功能,在皮肤站中应用的皮肤,玩家无需安装任何皮肤 Mod,进入游戏即可看到自己设置的皮肤(支持双层皮肤、支持 Alex 模型,由于游戏本身限制不支持高清皮肤);
  3. 单账户多角色功能,玩家可以像登录正版那样用「邮箱」和「密码」登录游戏,而且如果你在皮肤站中添加了多个角色的话,还可以在启动页面选择要用哪个角色进入游戏(Yggdrasil API 实现了这个功能,但是 Mojang 的正版登录服务器并未实现该功能),HMCL 等启动器都实现了本功能;
  4. 你还可以修改那些流行的开源启动器源码(大牌启动器一般都支持这种方法),搞一个「xx 服务器专属启动器」;)

如何,是不是有些心动呢?

一些技术细节的小提示

  • 因为这是直接替换 Mojang 官方的 Yggdrasil API 地址,所以某些自己写启动器的仁兄,直接把那些 https://authserver.mojang.com 开头的那些 API 地址替换掉就 OK 了;
  • 不是自己写启动器的同学,可以写一个 BAT 批处理,里面写上 java -javaagent: -jar HMCL.jar,就可以直接一键 hack 并打开 HMCL 这类基于 JVM 的启动器了(前提是你要在客户端里打包一个跨平台版的 HMCL.jar);
  • 如何给【游戏本体】加载 authlib-agent 呢?其实只要直接在启动器启动 Minecraft 时的 JVM 参数中添加一个 -javaagent 就好了。主流的启动器(e.g. HMCL)都支持自定义这个选项,自己写的启动器更不用说啦;
  • 给服务器加载 authlib-agent 的步骤和游戏本体一样,启动时加个 JVM 参数就好了;
  • authlib-agent 也可以用 Forge 加载哦;

后记

和 @yushijinhun 在他 authlib-agent 发表在 MCBBS 上的帖子中说的一样,这种解决方案还是比较高端的,部署起来也比较复杂,适合中大型服务器使用,十几个人玩玩的服务器还是不要折腾了(当然,你愿意折腾我也是很高兴的)。

因此,我希望你决定部署这套系统之前有一定的问题解决能力。我是不会回答任何「怎么安装」、「怎么部署」之类笼统的问题的,毕竟我的时间也不多,见谅 ;)

如果关于本帖中描述的方案有什么想要探讨的,可以发送邮件至 <h#prinzeugen.net>,或者加入 QQ 群 <573741451> 讨论,我是不经常看 MCBBS 的回复的。

最后,再次感谢 @yushijinhun,正是他的 authlib-agent 项目让这一切成为可能,鼓掌!

声明:本文转载自 MCBBS,作者为 ーのものー,原文网址:http://www.mcbbs.net/thread-718219-1-1.html