Minecraft(我的世界)中文论坛

标题: authlib-injector 开源的游戏外登录规范

作者: yushijinhun    时间: 2017-12-16 20:50
标题: authlib-injector 开源的游戏外登录规范
本帖最后由 yushijinhun 于 2017-12-24 13:04 编辑

0x00 前言


本项目的前身是authlib-agenthttp://www.mcbbs.net/thread-556500-1-1.html)。
本项目的原理如果用一句话概括,就是:把Mojang的正版登录API劫持成自己的,从而实现游戏外登录。


众所周知,如果MC服务端不开启online-mode,那么就无法对入服玩家进行认证(任何人都可以用任何身份进入服务器),但并不是所有服主都愿意开启online-mode(如果开启,你的玩家都必须是正版用户),这就催生了不少非Mojng官方的登录系统的产生。

这些登录系统大体可以分为以下两类:

它们的确解决了非正版服的验证问题,但无论在功能上还是在安全性上,都是不及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服务端进行验证相关操作。

特性:


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 相关项目





0x05 鸣谢




作者: YueHaxgu    时间: 2017-12-16 21:54
我想知道这是个啥玩意儿
作者: :spgbigfan:    时间: 2017-12-16 22:24
跳楼牛逼!!
作者: 1377023219    时间: 2017-12-18 11:03
1.找HMCL和PCL等启动的作者加入支持
2.自己弄一个启动器
3.在服务器端弄传统的聊天栏登录或木牌

我觉得写mod没啥意义,因为换启动器比加mod简单多了(对新人来说,有的连forge都不知道,更别说拖入原版jar,像我原版玩家,原版+optifine,都没有forge的),mod最多对正版启动器的玩家方便点,你尝试加个正版绑定就行了。
作者: yushijinhun    时间: 2017-12-19 18:00
1377023219 发表于 2017-12-18 11:03
1.找HMCL和PCL等启动的作者加入支持
2.自己弄一个启动器
3.在服务器端弄传统的聊天栏登录或木牌

1. 启动器作者我已经约好了的,就比如我在文中提到的ci010的启动器。
2. 与其重起炉灶,不如向现有启动器开pr,内置这个功能或者以插件的形式提供。
3. 传统的聊天栏登录正是我想要取代的。对两者优劣的具体分析,可见621sama的这篇文章:https://blessing.studio/minecraft-yggdrasil-api-third-party-implementation/

authlib-injector并不需要forge/liteloader才能工作。在设计之初我使用javaagent来进行注入,这样只需添加一个JVM参数即可。在启动器支持的情况下,添加JVM参数是启动器自己完成的,不需要干预。
而目前没有成熟的支持authlib-injector的启动器是现状,并且用户也不一定乐意使用支持它的启动器,所以我就想通过mod的方式来加载。在这种情况下,启动器不需要支持authlib-injector,但是需要forge/liteloader,并且用户要手动将authlib-injector放进mods中。
作者: 410855403    时间: 2017-12-28 22:39
如果项目开源可以联系国外开发者共同开发
作者: volta薯片~    时间: 2018-1-13 22:00
和主流启动器作者沟通一下
如果能支持的话,不就实现推广了
作者: 死你,哈    时间: 2018-1-15 19:56
厉害厉害,可以可以,666
作者: 死你,哈    时间: 2018-1-17 19:06
厉害厉害,可以可以,666
作者: FlyGay    时间: 2018-1-20 18:17
这样子实现起来不仅会可能很冗杂外加普及有点困难的,因为即使是懂得开发亦或者是已经开发好拿去用的伺服或多或少会遇到各种瓶颈。想要实现,我觉得最好就是在“内部”实现,client/serverend不也可以被反编译了吗(划掉、逃
emmm...至少我还没有这个功力,想象力总该要有。
作者: yushijinhun    时间: 2018-1-22 18:59
FlyGay 发表于 2018-1-20 18:17
这样子实现起来不仅会可能很冗杂外加普及有点困难的,因为即使是懂得开发亦或者是已经开发好拿去用的伺服或 ...

实现游戏外登录的方法肯定不止这一种。但选择的切入点不同,实现的难度也不同。mc客户端和服务端中,与登录相关的地方非常多,而且版本之间差异很大,再加上如spigot这样的第三方服务端,如果要从你说的“内部”下手,那么工作量就比较大。
相反,登录api在不同的客户端和服务端中都是一致的,即一段代表了api endpoint的url字符串。而且mojang为了保持其与不同mc版本间的兼容性,便不会对其做出破坏性的改动。所以,相对于从“内部”入手来说,从api处入手更为简单,而且也有更好的兼容性。
但你说的不无道理,yggdrasil服务端的开发确实有一定难度,而这正是我在解决的。目前我在做的有三点,一是完善规范,二是为yggdrasil服务端编写自动化的集成测试,三是编写一个最简的yggdrasil服务端实现以供参考。
同时我也在和blessing skin server及hmcl的作者合作,他们会在下一个主版本里支持authlib-injector。
作者: dogeop    时间: 2018-1-23 21:41
yggdrasil的服务端,forge简单,但是bukkit方向上面嘛。你除非也用launchwrapper去搞asm注入,把yggdrasil给换成你的。
否则就比较难。
作者: dogeop    时间: 2018-1-23 21:43
也有另外一个办法,你记不记得,jar根目录有个key文件,如果你用hosts劫持了mojang的域名,自己实现出一样的api endpoint进去,把它用的https key(证书)换掉,就可以实现开着online-mode登录了。
作者: dogeop    时间: 2018-1-23 21:57
哦对,直接把spigot编译好的com.mojang.authlib删了,自己实现一个魔改版authlib,加个读配置文件的步骤就好了么,配置文件自己规定一下。
(其实这是最简单粗暴的办法了)
作者: 维达哎哎    时间: 2018-1-23 23:44
原来的 authlib-agent-master 不是很好么,我用很久了,现在搞得这么复杂。

客户端用 bat 来 hack HTML 启动器
并且在高级设置内 hack 游戏

服务端就直接加一条参数,这样几乎是全版本通用的。

作者: 1933922282    时间: 2018-1-24 19:37
        Mcbbs有你更精彩~
作者: z109512502    时间: 2018-2-26 13:04
……很想用,但是不会用,很无奈
作者: yyeerai    时间: 2018-2-26 16:50
z109512502 发表于 2018-2-26 13:04
……很想用,但是不会用,很无奈

加qq教你
作者: z109512502    时间: 2018-2-28 16:55
yyeerai 发表于 2018-2-26 16:50
加qq教你

109512502,加我
作者: m13245jia    时间: 2018-3-1 20:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: m13245jia    时间: 2018-3-1 20:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: Romcnov    时间: 2018-3-16 21:42
正在尝试实现Authlib-injector规范的Yggdrasil服务端,感觉文档还是讲得有点不太清楚。
作者: 海螺螺    时间: 2018-3-16 22:40
Romcnov 发表于 2018-3-16 21:42
正在尝试实现Authlib-injector规范的Yggdrasil服务端,感觉文档还是讲得有点不太清楚。 ...

这是一个现有实现
https://github.com/to2mbn/yggdrasil-mock
作者: wangduidui    时间: 2018-3-17 12:59
强,前排围观
作者: xpesir    时间: 2018-5-13 01:31
本帖最后由 xpesir 于 2018-5-13 01:38 编辑

终于有人肝起了这东西啊。大概在14-15年我肝过 那时候是16版本的MC。后来移植到1.7中途弃坑。自己服务器用没公开 详细百度logincraft和LogCraftEX。不过也没啥详细的。
====================补充=======================
回去翻了下,发现那时的启动器源码还在23333333


QQ截图20180513013538.png (20.37 KB, 下载次数: 1)

QQ截图20180513013538.png

QQ图片20180513013524.png (23.65 KB, 下载次数: 1)

QQ图片20180513013524.png

作者: LQ柒小章XT    时间: 2018-6-17 01:23
版主编好的下载不了啦谁有
作者: Romcnov    时间: 2018-8-3 12:55
authlib-injector有没有QQ交流群什么的?
作者: MoCha_666    时间: 2018-8-8 12:28
如果出个教程就好了!
作者: Maple_Lemon    时间: 2018-10-6 22:29
这东西怎么用?
作者: wyxslh    时间: 2019-3-20 15:49
怎么实现authlib-injector和正版同时能登陆
作者: Bad_Ceiling    时间: 2019-3-23 00:46
好牛的样子
作者: SunDreams    时间: 2019-5-2 07:50
1.14使用时会导致无法开启服务端
作者: 2404540291    时间: 2019-5-2 12:41
正好需要
真是雪中送炭,
作者: 刘雨华    时间: 2019-6-27 07:08
你好,我现在使用authlib-injector开发了Makku启动器,目前遇到以下情况:
1 首次启动大概率提示验证服务正在停机维护,Yggdrasil服务器日志没提示收到请求
2 玩家因网络异常掉线后无法重连,会提示各种千奇百怪的错误,服务器控制台则是Netty的报错提示
如果需要详细日志,我可稍后上传,望解答。
作者: ImLazy    时间: 2019-7-22 09:07
表示1.14.3的服务器不能用
作者: xtr169    时间: 2019-8-22 09:55
规范真好
作者: zycdojar    时间: 2019-9-30 16:35
希望可以用mcp实现,因为javaargent并不是所有启动器都支持的
作者: 午申    时间: 2019-11-24 10:00
所以我要怎么获取属于我的API root?看了半天没看懂…
作者: 小帅120    时间: 2019-12-6 16:28
虽然看不懂 但是 为了装B必须说看到没这个就是什么来着......
作者: xiriyeyu    时间: 2020-3-7 14:24
感谢大佬分享!!!
作者: 深拥v    时间: 2020-3-11 12:48
1.12.2spigot端使用后玩家UUID全乱了,金币点券在线时长领地等全都成为另一个同名玩家的了

作者: n1529905750    时间: 2020-3-15 01:04
PCL什么时候可以支持啊

作者: 寒幽xy    时间: 2020-3-16 13:38
十分感谢,今天服务器被熊了
作者: sakurakaori    时间: 2020-3-29 09:46
怎么你这帖子里没有介绍怎么创建注册外置登录的注册网站的教程???也就是认证服务器那里,怎么创建属于自己的服务器注册网站???
作者: h'y'x    时间: 2020-4-8 11:41

MCBBS有你更精彩~
作者: 轻珞酱    时间: 2020-4-23 12:29
https://www.mcbbs.net/thread-974321-1-1.html
这是XenforoLogin的xenforo版本,目前使用authlib实现登录,希望可以考虑加入
作者: dongliang    时间: 2020-5-4 05:41
厉害厉害,可以可以,666