本文主要针对Windows系统所写

开始之前

在开始前首先来了解一下 Mojang 正版的 Minecraft 是怎样登录的。Mojang 专门定义了一个用于鉴权的 API 并应用于其旗下的游戏(Minecraft、Scrolls 等)。而 这一套 API 的名字就叫做 Yggdrasil(即北欧神话里的世界树,这名字可真几把炫酷)。通过使用正版验证,再也不用担心假人压测、自带外置登录(启动器里账号密码登录)、自带皮肤加载(不需要安装 CSL、USM 等皮肤补丁了)、Tab 栏显示头像等等。可以说,Minecraft 自带的 Yggdrasil API 鉴权系统比上面的那些什么登录插件啊什么外置登录的功能强多了,所以正版服务器online_mode=true也不用担心那些破事,因为官方的这一套鉴权系统以及很完善了。

基本原理

我们都知道,Mojang把这个API写死在代码里了,别人无法更改但是,Minecraft 是基于 JVM 的应用程序,我们就可以通过字节码替换的方法将官方的 API 地址替换成我们自己实现的 API 地址。而为了实现这个功能,我们用到了 to2mbn/authlib-agent 这个项目。

解决方案

authlib-agent 官方也提供了一个 Java 编写的后端 yggdrasil-backend 。虽然完整实现了 Yggdrasil API,但没病没有直观的网页管理。要想实际使用还是欠点。但是,我之前接触过一个叫做BlessingSkin的Minecraft皮肤站,而在暑假的时候,其开发者 也正好为该项目写了一个实现YggdrasilAPI的皮肤站。那么为何不适用这个更成熟的系统呢?

开始搭建

搭建BlessingSkinServer

该项目的Github地址为 https://github.com/printempw/blessing-skin-server 搭建方法README 中写的简洁但不失重点。这里就不再赘述了。但需要注意的是,程序默认没有plugins文件夹。你需要手动创建一个。不然会报错的QWQ

使BlessingSkin支持YggdrasilAPI

BlessinSkin默认是不支持YggdrasilAPI的。作者是通过插件的方法实现的兼容该API。启用该API的方法为:

  1. 确保你的BlessingSkin正确安装,各项功能能正常使用。
  2. 下载Yggdrasil API 插件,解压放入plugins文件夹当中(或使用插件市场下载)。并在插件管理处启用该API。

完成了以上两部以后,BlessingSkin就支持YggdrasilAPI了!是不是很简单呢?

编译authlibagent

到目前为止,我们只是使BlessingSkin支持了YggdrasilAPI。但我们还需要借助authlibagent来“hack”客户端,使用我们的账号系统。

authlibagent项目的构建文件是 .sh 脚本,但Windows系统是不支持运行sh脚本的。为了解决这个问题,有两个解决方案

  1. 使用 Linux 子系统
  2. 使用Git

这里个人比较推荐方案2。因为Git的大小跟Linux子系统比起来要小不少而且还能支持非Windows10 1709及以上的系统。

方案2使用方法:在 这里 下载GIT,安装.

注意:该项目需要JDK, MAVEN环境的支持! 若何配置Maven环境可参考 w3 school的这篇文章

  1. authlib-agent项目 下载到本地
  2. 编辑configure.sh 将AGENT_API_ROOT的值更改为http://{你的站点地址}/api/yggdrasil。(比如 https://skin.honoka.club/api/yggdrasil)和AGENT_SKIN_DOMAINS的值更改为你皮肤站的域名(比如skin.honoka.club)
  3. 在当前目录下,单击鼠标右键,选择”Git Bash Here”
  4. 执行./build.sh进行构建. 如果构建顺利完成则会在当前目录下产生authlibagent.jaryggdrasil-backend.war. 它们分别是加载到Minecraft Client/Server中的javaagent, 和yggdrasil后端.但我们不会用到yggdrasil-backend.war这个文件

到此,客户端的编译也结束了

注:初次构建所需时间较长,具体时间长短和网络有关(我第一次构建花了将近1个小时)

如何在客户端正确加载

该项目官方wiki描述的加载方式是:

无Forge环境下加载authlibagent

在无Forge的环境下, authlibagent需要通过javaagent来载入. 这适用于所有jvm语言编写的程序, 包括客户端, 服务端, 启动器等. 方法为: 启动时在JVM参数中加入-javaagent:<authlibagent.jar路径>; 或配置环境变量JAVA_TOOL_OPTIONS-javaagent:<authlibagent.jar路径>.

对于BungeeCord

如果使用bungeecord, 那么在所有服务端上都需要加载authlibagent, 但只应有bungeecord打开online-mode, 其它服务端应关闭online-mode.

authlibagent参数

authlibagent默认会监控所有类加载(白名单内的包除外), 对字节码中的字符串常量进行分析和替换. 一般来说, 这不会造成明显的性能损耗. 该功能可以提供在-javaagent:<authlibagent.jar路径>后添加=-exhaustive关闭(添加=+exhaustive则开启, 该功能默认开启). 此时, authlibagent只会监控authlib中及bungeecord中几个的类, 进行预设好的字节码替换.

Forge环境下加载authlibagent

如果您使用forge, 只需要将authlibagent.jar放入mods文件夹即可. 当然, 通过javaagent加载也是可以的.

但是在实际的过程中,我尝试通过forge加载,但并没有成功。所以这里重点介绍通过添加jvm参数启动的方法。我这里使用的是HMCL启动器全平台版 推荐下载最新版本文件。下载下来后,将编译好的authlibagent.jar文件放到和HMCL启动器同一目录下。创建一个启动脚本(或直接在cmd中进入这个目录输入)内容为java -javaagent:authlibagent.jar -jar <HMCL启动器名称.jar> 执行脚本,在接下来打开的窗口中选择 正版验证,然后输入你在皮肤站的邮箱和密码就可以啦~

至此,教程完结~ 如果有任何问题的话可以留言或者发邮件给我

参考资料:

https://blessing.studio/minecraft-yggdrasil-api-third-party-implementation/

https://github.com/to2mbn/authlib-agent/wiki

#后记
现在有一些启动支持自定义ygg了,如果你有兴趣的话,可以去看看。以下列出了几个选择,但不代表这就是全部
HMCL3 ()
PixelMinecraftLuncher

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。