真正实现Minecraft高级登录(外置登录)的几种方案

通常把Minecraft服务器的登录方式分为高级登录(外置登录)和内置登录。高级登录的特点是用户的登录操作在启动器完成,启动器传递token给Minecraft客户端,客户端在加入服务器时直接将token传递给服务端完成身份验证。正版Minecraft登录就是典型的外置登录。而一般的非正版服务器(online-mode=false)则是身份验证仅在用户加入游戏后通过聊天框输入密码完成认证,此时用户已经加入了游戏,仅仅靠登录插件来限制用户进行其他操作。
而内置登录往往存在下列问题:

  1. 玩家在登录前已经进入了游戏。恶意用户可以借此进行假人压测攻击服务器
  2. 由于登录操作复杂并且退出游戏后就需要重新登录,玩家往往把密码设置得较为简单,留下安全隐患
  3. 对于Mod服务器来说,登录插件无法限制Mod行为。例如NEI仍然可以正常使用而不受登录插件限制

如果想根除上述问题,就必须要改换成高级登录。

实现

倘若从零开始自己写一套外部登录系统,意味着我们需要自己写服务端插件+验证端+客户端模组+启动器,还需要考虑兼容性、跨平台等问题。显然,这项工程十分浩大并且不划算。换个思路,mojang已经实现了自己的正版登录系统,我们能否将minecraft自带的正版登录系统为己所用呢?

方案1: 用hosts劫持域名解析

操作复杂度:高

修改操作系统的hosts文件:
(1.2.3.4为你的身份验证服务器IP地址)

1.2.3.4 sessionserver.mojang.com
1.2.3.4 api.mojang.com

然后,自己签署一个具有“所有颁发策略” “所以应用程序策略”的根证书,在MC服务器和身份验证服务器两边信任这个根证书。
接着,自己签发 *.mojang.com 的SSL证书,部署到身份验证服务器,对这两个域名使用自签发证书。
最后,自己按照此文档实现一套Yggdrasil服务端。
至于启动器方面也很简单,拿一套开源的启动器的代码(如BMCL,HMCL)然后批量替换上面给出的两个域名为你的身份验证服务器的域名,然后编译即可。
(用于客户端登录的身份验证服务器必须使用正规证书机构签发的证书,如let’s encrypt,当然你要是能拿到管理员权限悄悄导入根证书就不用管这句提示了)

方案2:用javaagent在运行时动态劫持身份验证地址

操作复杂度:中高

国内有大神已经实现了这种方案,并且最新的HMCL启动器原生支持使用这种方案实现客户端的高级登录。
点击此处查看,同样需要按照此文档实现一套Yggdrasil服务端
具体使用方法可以参考Blessing Studio上的文章

比起方案1,这个方案的优点是可以略过复杂的签发证书过程,并且API地址可以随便起,自己怎么爽怎么来(比如MoeCraft这样:https://accounts.moecraft.net/?s=API/Mc/Authlib&params=/)

方案3:使用他人编写Mod+插件+启动器解决

操作复杂度:低

参见SakuraLogin 樱花登录,可惜不支持 Sponge :(

附注

上文提到的《Yggdrasil服务端技术规范》中有一点需要注意:
以“用户部分-登录”为例,文档中的“请求格式”并 不是在用JSON描述这个请求POST内容的具体格式 ,而是真的POST了一个JSON文本过来!这点很误导人。
以PHP为例,使用 $_POST 无法获得任何数据,要获得POST提交的文本,应该使用 file_get_contents('php://input') 直接读取请求的原始数据


正在加载评论。你可能需要科学上网才能正常加载评论区