0x00 前言
本项目的前身是authlib-agent(http://www.mcbbs.net/thread-556500-1-1.html)。
本项目的原理如果用一句话概括,就是:把Mojang的正版登录API劫持成自己的,从而实现游戏外登录。
众所周知,如果MC服务端不开启online-mode,那么就无法对入服玩家进行认证(任何人都可以用任何身份进入服务器),但并不是所有服主都愿意开启online-mode(如果开启,你的玩家都必须是正版用户),这就催生了不少非Mojng官方的登录系统的产生。
这些登录系统大体可以分为以下两类:
- 游戏内登录(如Authme)
- 游戏外登录(如BeeLogin)
它们的确解决了非正版服的验证问题,但无论在功能上还是在安全性上,都是不及Mojang的正版验证系统的。
那么有没有什么办法可以实现与正版相媲美的验证系统呢。答案是有的,就是劫持Mojang的正版验证API(也叫Yggdrasil),让它为我所用。
这便是authlib-injector所做的事情:将MC服务端/客户端中Mojang的正版验证API,替换成自己的。这样你便得到了一个功能和正版验证近乎一样的验证系统。
事实上,这样的技术早在前几年就已经被我开发出来(也就是authlib-agent项目)。
但是问题也随之而来:如果每一个服务器都要自己开发一个Yggdrasil服务端、一个服务器专用的启动器,那么不但服主会有很大的工作量,而且玩家也会有许多不便。
关于authlib-agent项目
在开发authlib-agent时,我仅仅是抱着玩玩的心态,而未曾想过它会被众多服务器所用。当时做出的许多不合理设计(如随意命名的API Endpoint、配置文件内置于JAR中),现在也逐步暴露了出来。而先前我开发authlib-agent的目的,也只是证明实现Yggdrasil私服的可行性。但现在看来,这已毋庸置疑。现在所需要的,是对这一技术的推广。
由于不完备和缺少文档,许多服主和开发者对authlib-agent望而却步。确实,authlib-agent项目真正能帮助到开发者的也只有javaagent部分。要将这个技术投入实际使用中,还需要开发一个完善的Yggdrasil服务端,和一个支持authlib-agent的启动器,这样的任务绝不是凭一人之力能够完成的。
因此,我萌生了一个想法:
能否制定一个民间规范,只要启动器和Yggdrasil服务端的开发者共同遵守它,就能使它们两个能够一起工作?
如果这能够实现的话,试想:
一个服主在GitHub上找到了一个实现该规范的验证服务端,然后在服务器上部署了它;
而玩家在该MC服务器注册之后,打开他平时使用的(实现上文所述规范的)MC启动器,输入该服务器的URL,以及他自己的用户名和密码,便能像正版一般进行游戏。
0x01 简介
authlib-injector是一个游戏外登录规范,使用CC BY-SA 4.0授权。它描述了一套类Mojang Yggdrasil的API,并且对Yggdrasil服务端及启动器的实现作出了规范。
authlib-injector也包含了一个mod,使用GPL-3.0授权。它能够注入到MC客户端和服务端,使之使用指定的Yggdrasil服务端进行验证相关操作。
特性:
- 支持获取远程配置
直接从验证服务端获取相关配置信息(见此),不需要像authlib-agent一样自己编译和生成JAR - 更为细致的文档
较authlib-agent,对验证服务端和启动器给出了更加详细的规范 - 平台通适性
支持绝大多数基于JVM的MC服务端,如Spigot、Bungeecord
支持绝大多数版本的MC客户端 - Maybe more?
GitHub Wiki(规范部分): to2mbn/authlib-injector/wiki
GitHub Repo(mod部分):to2mbn/authlib-injector
0x02 如何贡献
该项目依然处于早期阶段,这个规范也并没有多少实现。
如果你读过前言部分,就不难意识到这个项目绝不是能凭我一己之力完成的。而要实现上文我所试想的,也绝不是一朝一日。
我希望广大启动器和验证服务端的开发者能够支持我这个规范,并对其不足之处提出建议。
如果你对本规范有修改建议,或是想反馈mod部分的问题,请在GitHub上开一个issue。
如果你想对本项目作出贡献,欢迎你对本项目的mod部分开PR。
如果你是一个验证服务端或启动器开发者,你并不一定需要在GitHub上开PR,只要在你的程序中实现本规范,也算是对本项目的支持。
0x03 未来计划
GUI登录
由于启动器不支持authlib-injector的情况难免会出现,我打算在authlib-injector中实现一个登录GUI。
如果启动器不支持本规范,玩家需要将authlib-injector放入mods目录(或是添加javaagent参数,这适用于原版),然后在启动器里选择离线验证。
当authlib-injector检测到启动器没有提供登录信息时,便挂起启动进程,要求用户登录,之后将登录信息注入到MC启动参数中。
这就相当于把原来属于启动器的验证任务,转移到了authlib-injector。
自动化测试和Yggdrasil服务端mock
提供一套自动化的API集成测试(依照规范编写),能够让验证服务端开发者对自己的服务端进行测试。
提供一个最简可用Yggdrasil服务端,能够让启动器开发者mock Yggdrasil服务端,从而对启动器进行测试。
GitHub:to2mbn/yggdrasil-mock
0x04 相关项目
- InfinityStudio/ILauncher ci010主导开发的启动器
- Indexyz/Identity Indexyz开发的验证服务端
- printempw/blessing-skin-server 第三方Minecraft皮肤站,由621sama主导开发
注:该验证服务端目前使用的是authlib-agent,准备迁移到authlib-injector。但主要开发者因学业关系,还未能进行 - Maybe yours?
0x05 鸣谢