Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 7580|回复: 28

[开发资源] authlib-injector 开源的游戏外登录规范

[复制链接]
发表于 2017-12-16 20:50:54 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 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官方的登录系统的产生。

这些登录系统大体可以分为以下两类:
  • 游戏内登录(如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 相关项目





0x05 鸣谢



评分

参与人数 14人气 +25 金粒 +300 贡献 +1 收起 理由
gooding300 + 1 MCBBS有你更精彩~
1582952890 + 3 + 20 MCBBS有你更精彩~
琉璃糖 + 1 MCBBS有你更精彩~
yyeerai + 2 + 40 神乎其技,不服不行!
1015614941 + 1 + 10 MCBBS有你更精彩~
410855403 + 2 + 40 MCBBS有你更精彩~
gamerteam + 2 + 50 MCBBS有你更精彩~
tnqzh123 + 2 + 30 MCBBS有你更精彩~
Smokey_Days + 3 + 20 厉害了。
xmdhs + 2 不会用 不会用
chyx + 3 很厉害 但为啥要用呢,,,,
乙烯_中国 + 2 MCBBS有你更精彩~
a6809936 + 50 假装加了个star
kakagou12 + 2 + 40 神乎其技,不服不行!

查看全部评分

发表于 2017-12-16 21:54:05 | 显示全部楼层
我想知道这是个啥玩意儿

评分

参与人数 1金粒 +1 收起 理由
gooding300 + 1 +1

查看全部评分

回复

使用道具 举报

发表于 2017-12-16 22:24:07 | 显示全部楼层
跳楼牛逼!!
回复

使用道具 举报

发表于 2017-12-18 11:03:54 | 显示全部楼层
1.找HMCL和PCL等启动的作者加入支持
2.自己弄一个启动器
3.在服务器端弄传统的聊天栏登录或木牌

我觉得写mod没啥意义,因为换启动器比加mod简单多了(对新人来说,有的连forge都不知道,更别说拖入原版jar,像我原版玩家,原版+optifine,都没有forge的),mod最多对正版启动器的玩家方便点,你尝试加个正版绑定就行了。
回复

使用道具 举报

 楼主| 发表于 2017-12-19 18:00:56 来自手机 | 显示全部楼层
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中。

评分

参与人数 1人气 +1 收起 理由
tnqzh123 + 1 MCBBS有你更精彩~

查看全部评分

回复

使用道具 举报

发表于 2017-12-28 22:39:41 | 显示全部楼层
如果项目开源可以联系国外开发者共同开发

评分

参与人数 1金粒 +1 收起 理由
gooding300 + 1 开源的

查看全部评分

回复

使用道具 举报

发表于 2018-1-13 22:00:43 | 显示全部楼层
和主流启动器作者沟通一下
如果能支持的话,不就实现推广了
回复

使用道具 举报

发表于 2018-1-15 19:56:04 | 显示全部楼层
厉害厉害,可以可以,666
回复

使用道具 举报

发表于 2018-1-17 19:06:17 | 显示全部楼层
厉害厉害,可以可以,666
回复

使用道具 举报

发表于 2018-1-20 18:17:58 | 显示全部楼层
这样子实现起来不仅会可能很冗杂外加普及有点困难的,因为即使是懂得开发亦或者是已经开发好拿去用的伺服或多或少会遇到各种瓶颈。想要实现,我觉得最好就是在“内部”实现,client/serverend不也可以被反编译了吗(划掉、逃
emmm...至少我还没有这个功力,想象力总该要有。
回复

使用道具 举报

 楼主| 发表于 2018-1-22 18:59:28 来自手机 | 显示全部楼层
FlyGay 发表于 2018-1-20 18:17
这样子实现起来不仅会可能很冗杂外加普及有点困难的,因为即使是懂得开发亦或者是已经开发好拿去用的伺服或 ...

实现游戏外登录的方法肯定不止这一种。但选择的切入点不同,实现的难度也不同。mc客户端和服务端中,与登录相关的地方非常多,而且版本之间差异很大,再加上如spigot这样的第三方服务端,如果要从你说的“内部”下手,那么工作量就比较大。
相反,登录api在不同的客户端和服务端中都是一致的,即一段代表了api endpoint的url字符串。而且mojang为了保持其与不同mc版本间的兼容性,便不会对其做出破坏性的改动。所以,相对于从“内部”入手来说,从api处入手更为简单,而且也有更好的兼容性。
但你说的不无道理,yggdrasil服务端的开发确实有一定难度,而这正是我在解决的。目前我在做的有三点,一是完善规范,二是为yggdrasil服务端编写自动化的集成测试,三是编写一个最简的yggdrasil服务端实现以供参考。
同时我也在和blessing skin server及hmcl的作者合作,他们会在下一个主版本里支持authlib-injector。
回复

使用道具 举报

发表于 2018-1-23 21:41:39 | 显示全部楼层
yggdrasil的服务端,forge简单,但是bukkit方向上面嘛。你除非也用launchwrapper去搞asm注入,把yggdrasil给换成你的。
否则就比较难。
回复

使用道具 举报

发表于 2018-1-23 21:43:17 | 显示全部楼层
也有另外一个办法,你记不记得,jar根目录有个key文件,如果你用hosts劫持了mojang的域名,自己实现出一样的api endpoint进去,把它用的https key(证书)换掉,就可以实现开着online-mode登录了。
回复

使用道具 举报

发表于 2018-1-23 21:57:41 | 显示全部楼层
哦对,直接把spigot编译好的com.mojang.authlib删了,自己实现一个魔改版authlib,加个读配置文件的步骤就好了么,配置文件自己规定一下。
(其实这是最简单粗暴的办法了)
回复

使用道具 举报

发表于 2018-1-23 23:44:45 | 显示全部楼层
原来的 authlib-agent-master 不是很好么,我用很久了,现在搞得这么复杂。

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2018-10-21 18:42 , Processed in 0.128029 second(s), 7 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表