本文主要针对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的方法为:
- 确保你的BlessingSkin正确安装,各项功能能正常使用。
- 下载
Yggdrasil API 插件
,解压放入plugins文件夹当中(或使用插件市场
下载)。并在插件管理处启用该API。
完成了以上两部以后,BlessingSkin就支持YggdrasilAPI了!是不是很简单呢?
编译authlibagent
到目前为止,我们只是使BlessingSkin支持了YggdrasilAPI。但我们还需要借助authlibagent来“hack”客户端,使用我们的账号系统。
authlibagent项目的构建文件是 .sh 脚本,但Windows系统是不支持运行sh脚本的。为了解决这个问题,有两个解决方案
- 使用 Linux 子系统
- 使用Git
这里个人比较推荐方案2。因为Git的大小跟Linux子系统比起来要小不少而且还能支持非Windows10 1709及以上的系统。
方案2使用方法:在 这里 下载GIT,安装.
注意:该项目需要JDK, MAVEN环境的支持! 若何配置Maven环境可参考 w3 school的这篇文章
- 将authlib-agent项目 下载到本地
- 编辑configure.sh 将
AGENT_API_ROOT
的值更改为http://{你的站点地址}/api/yggdrasil
。(比如https://skin.honoka.club/api/yggdrasil
)和AGENT_SKIN_DOMAINS
的值更改为你皮肤站的域名(比如skin.honoka.club
) - 在当前目录下,单击鼠标右键,选择”Git Bash Here”
- 执行
./build.sh
进行构建. 如果构建顺利完成则会在当前目录下产生authlibagent.jar
和yggdrasil-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 国际许可协议 进行许可。