ーのものー
本帖最后由 ーのものー 于 2018-2-22 00:23 编辑
本文已于 2018-2-22 更新,添加了对 authlib-injector 的支持。

具体请查阅:https://github.com/printempw/yggdrasil-api/wiki

不知道诸君对 Minecraft 的正版登录系统(Yggdrasil API)有多少了解呢?

现在国内绝大多数运作于离线模式(online_mdoe=false)下的服务器都是使用的 Authme、CrazyLogin 等登录插件,也就是进入服务器之后再进行认证(e.g. /login <password>)的内置登录系统。虽然这样进入了服务器再登录的机制在小型服务器上没什么问题,但是服务器人一多,就容易出现各种各样的隐患了(假人、未登录也能发送指令 etc.),相信这方面各位腐竹都比较了解。

用过 Minecraft 正版登录的同学应该都知道,正版 Minecraft 是在进入游戏之前就要在【启动器】中进行登录操作的,而且只有登录之后你才能进入开了正版验证的服务器(online_mode=true)中游玩,否则是连服务器都进不去的。

目前也有很多第三方开发的【外置登录系统】都在尝试实现 Minecraft 正版登录的这一效果,这些软件无不都是将【登陆鉴权】这一操作从【进入服务器后】提到了【启动游戏前】来,配合服务端插件使用,在启动器中就是用账号密码登录后,启动游戏就可以直接进入服务器开玩了,比起 Authme 那样进入服务器还要输入指令登录不知道高到哪里去了。

这也是为什么软件开发版中那些「外置登录系统」很受欢迎的原因(包括不限于 MadAuth、WebLogin、BeeLogin、WebRegister、冰棂登陆系统),这样不仅提升了玩家的游戏体验以及服务器的安全性,还顺带能有一个「服务器专用启动器」,逼格不是高了一点半点(笑)

其实这些软件的原理就是将原本的登录鉴权这一步骤从游戏里抽出来了,将其放到启动器 or 网页上去,而服务端插件的功能就只剩下「查询数据库中用户的登录状态,决定是否放行」:




这样也没什么不好的,不是吗?那我今天要介绍的这种方法和那些「外置登录系统」有什么差别呢?

======== 神秘的分鸽线 ===========

★ 实现原理

其实说到底,那些「外置登录系统」都是致力于实现和 Mojang 官方的正版登录类似的体验(启动器中登录,启动游戏后直接就能进入服务器)。那么我们为何不来个大胆的想法,让 Mojang 那套正版登录的鉴权系统为我们所用?

这里必须要感谢 @yushijinhun 开发的 authlib-injector,正是因为有了这个开源项目,本帖所描述的方案才得以实现。

authlib-injector 是啥呢?简单来说,用了这玩意就可以把 Minecraft 内部写死的 Mojang 官方正版登录 API(也就是 Yggdrasil API)的地址给替换成自定义的地址(ASM 字节码替换),从而实现了和正版登录一样的功能:



是不是很屌呢?如果你还是没听懂上面我讲的是什么鬼,那我就说得更通俗一些:

我们可以把 Mojang 官方正版登录的 API 【劫持】成我们自己的啦!

那么劫持之后能实现什么效果呢?

可以实现几乎和 Mojang 官方正版登录一样的效果。可以说,官方的正版登录有什么功能,使用 authlib-injector 后就能实现什么功能,甚至比 Mojang 官方的功能更多(e.g. 单用户多角色)。

不过这个方法只有唯一的一个弊端:

我们【劫持】了 Mojang 官方的 API,那也就意味着我们必须要实现一个和官方 Yggdrasil API 功能一模一样的 API。因为 authlib-injector 能做的只有替换掉 API 地址,至于我们的第三方 API,那就得靠我们自己去写代码实现了。

我相信,这对于绝大多数的同学都是非常痛苦的,你又要去查阅 Yggdrasil API 的文档(还没有提到很多自己实现时可能遇到的坑),还要从头开始写一个用户管理系统、角色系统、皮肤系统(上传管理、皮肤广场 etc.)、管理后台……天哪,这太可怕了!

虽然 @yushijinhun 同时也提供了一套他自己开发的 Yggdrasil API 后端实现,但是说实话那个太 简 陋 了,远远达不到实际生产应用的标准(只有一套 RESTful API,没有前端界面,也只有基础功能),所以我相信大部分同学想要在服务器上部署 authlib-injector 的时候还是有些顾虑的。

那么现在,终于到了我发这个帖子的目的所在了。


====== 又是一个神秘的分鸽线 ========

★ 实现效果

不知道现在正在阅读此贴的各位有没有听说过 Blessing Skin 这个皮肤站程序呢?

如果有,那事情就好说了。虽然重头开发一套 Yggdrasil API 的杂七杂八系统很够呛,但是幸运的是,我之前一直有在维护 Blessing Skin 这个皮肤站程序,并且在 v3 版本后,皮肤站全面支持的「单用户多角色」功能,再加上皮肤站本身就很完善的角色管理、皮肤上传与分享、后台管理等等功能,这也就意味着,我们可以直接使用皮肤站的用户系统,在此基础上实现一个第三方的 Yggdrasil API。

更幸运的是,今年初的时候我给 Blessing Skin 加上了【插件系统】(v3.2+),这也就意味着,我可以在完全不修改皮肤站现有源代码的情况下,以【插件】的形式提供一个 Yggdrasil API 服务。

废话不多说,先看效果:



▲在皮肤站「角色管理」中可添加多个角色



▲使用皮肤站的邮箱与密码登录后,配合 HMCL 实现多角色选择



▲游戏内的显示效果,无需皮肤 Mod 即可加载皮肤站中设定好的皮肤 & 披风,甚至能够实现原本只有正版登录才能实现的 TAB 栏头像显示哦


====== 双是一个神秘的分鸽线 ========

★ 部署方法

看到上面的截图有没有心动呢?

这里是具体部署方法(打不开的话还请自行解决):

https://github.com/printempw/yggdrasil-api/wiki

看起来很麻烦,是吗?

但是如果你耐心部署完后,你就能得到以下功能:



你觉得如何呢?


====== 叒是一个神秘的分鸽线 ========

★ 一些技术细节的小提示



如果你也想自己实现一个 Yggdrasil API,我写了一篇 博客文章,记录了一下自己实现 Yggdrasil API 时可能遇到的坑,希望会对你有所帮助。


====== 叕是一个神秘的分鸽线 ========

★ 后记

这种解决方案还是比较高端的,部署起来也比较复杂,比较适合中大型服务器使用,十几个人玩玩的服务器还是不要折腾了(当然,你愿意折腾我也是很高兴的)。

因此,我希望你决定部署这套系统之前有一定的问题解决能力。我是不会回答任何「怎么安装」「怎么部署」之类笼统的问题的,毕竟我的时间也不多,见谅 ;)

如果关于本帖中描述的方案有什么想要探讨的,可以发送邮件至 <h#prinzeugen.net>,或者加入 QQ 群 <573741451> 讨论,我是不经常看 MCBBS 的回复的。

最后,再次感谢 @yushijinhun,正是他的 authlib-injector 项目让这一切成为可能,鼓掌!


来自群组: Blessing Skin

a1527019700
很棒的一个作品

tallmoon
支持楼主的分享!太感谢了!

tallmoon
楼主我是本地配置的那个API地址我改的是本地,本地访问一切都OK放在HMCL的启动器上cmd输出的也ok,但是点启动游戏出现无法连接认证服务器

l89669
本帖最后由 l89669 于 2017-8-11 16:29 编辑

嘿嘿嘿,这套系统已经在本萌新的服务器应用上了,效果很好
顺便一说,这个想法是我跟621sama提的(https://github.com/printempw/blessing-skin-server/issues/65
并且协助完成了项目的上线测试和排错=。=


2692611232
都来支持一下

深海鲸鱼座
BeeLogin被点名了稍微有点慌233
老早就抛弃自己的BeeLogin以后跑去试着搭建@yushijinhun的后端的时候就被坑着了,有别的后端着实是方便不少。
向大佬势力低头233
顺便,BeeLogin这个**项目是哪个逗比写的,欸,那个逗比好像就是蓝鲸啊233

wwwer
哇,我看到超级管理员的头像居然是我改的那个爬行娘皮肤

z1252583957
遇到一个很棘手的问题想请教一下楼主,按照上面的方式实现了外置登录,但现在服务器里只能存在一名玩家在线,即只要一个玩家一登录,在游戏中的玩家就会掉线。请问这是什么原因造成的呢?

chenyiii
感谢楼主分享 已经下载咯

默默、无闻
本帖最后由 默默、无闻 于 2017-11-26 03:46 编辑

超赞, 不过貌似 authlib-agent 已被弃坑. 倒是希望后端能兼容新坑 authlib-injector

122474363
为什么服务器有一个玩家,在登录另一个玩家的时候都会掉线。不会超过3个玩家。。因为2个玩家都全部掉线了。

ーのものー
默默、无闻 发表于 2017-11-26 03:45
超赞, 不过貌似 authlib-agent 已被弃坑. 倒是希望后端能兼容新坑 authlib-injector ...

是啊,之前就想把这篇文章回炉重造了,奈何最近都没有时间。估计这个月底可以搞定(flag

ーのものー
122474363 发表于 2017-11-28 02:45
为什么服务器有一个玩家,在登录另一个玩家的时候都会掉线。不会超过3个玩家。。因为2个玩家都全部掉线了。 ...

请尝试添加「材质签名」(就是把 authlib-agent 编译生成的那个 key.pem 文件放到皮肤站 yggdrasil-api 插件的根目录下)。具体可以加帖子里那个 QQ 群询问,之前也有人遇到过同样的问题。

ーのものー
z1252583957 发表于 2017-11-19 22:03
遇到一个很棘手的问题想请教一下楼主,按照上面的方式实现了外置登录,但现在服务器里只能存在一名玩家在线 ...

请尝试添加「材质签名」(就是把 authlib-agent 编译生成的那个 key.pem 文件放到皮肤站 yggdrasil-api 插件的根目录下)。具体可以加帖子里那个 QQ 群询问,之前也有人遇到过同样的问题。