2020年2月15日 阴 又是无聊的一天,病毒肆虐,哪也去不了,一年更新一次文章
Minecraft一般国内都是使用离线验证及盗版账号
如果想使用正版验证的话需要购买账号账号,但是也可以自己造一个正版验证接口
这里只讲走bc服进去验证方式,spigot的话应该也是一样,我这里只讲快速实现一个能够登录的API
//一个快速实现的API会请求下面3个接口地址 POST /authserver/authenticate //用于验证账号登陆 POST /sessionserver/session/minecraft/join //用于加入服务器 GET /sessionserver/session/minecraft/hasJoined //用于验证账号是否加入服务器
注:所有POST接口均为application/json请求
首先第一步启动器那边输入账号密码后会调用/authserver/authenticate 进行账号密码的验证,启动器请求参数如下
{ "username":"i@acgxt.com", "password":"明文密码" } 或是标准的 { "agent": { "name": "Minecraft", "version": 1 }, "username": "i@acgxt.com", "password": "明文密码", "requestUser": false, "clientToken": "00000000000000000000000000000000", "token": null }
你需要做的就是将客户端发来的账号和密码在你的数据库进行验证,验证成功后返回
{ "accessToken": "1fb9a5e90471804bd283e2a4bca95a4f", //服务端自己生成一个32位值 "clientToken": "00000000000000000000000000000000",//如果客户端传了token原样返回 "selectedProfile": {//设置玩家的账号 "id": "75f41576c9ae3be19e5af6091a7fa867", //这是玩家的UUID "name": "123"//玩家的名字 }, "availableProfiles": [ {//这是玩家的角色列表 "id": "75f41576c9ae3be19e5af6091a7fa867", "name": "123" } ] } //UUID的计算方式在最下面列出
然后就可以进入游戏了,进入游戏时客户端和服务端均会请求1个接口
当进入游戏后客户端先会请求/sessionserver/session/minecraft/join 将accessToken和用户信息发过来
{ "accessToken":"236207ff9bc64758adffabc1ea00f0c9",//AccessToken "selectedProfile":"f77f92355dc0df29e058152132e1631a",//玩家UUID "serverId":"-68b33c6559bc494d2465983642c9c451ab8c53ac"//服务器的ID,客户端自己计算的,每次都不相同 }
验证成功后返回http 204即可,如果验证失败需要返回JSON
{ "error"=>"error", "errorMessage'=>"§c登录验证已失效,请重新尝试登录!", "cause"=>"登录失效" }
当验证成功后,BC服务端会去GET请求/sessionserver/session/minecraft/hasJoined
请求这个地址时会发过来的数据是
"username":"用户名称"//这里不是UUID "serverId":"服务器ID"//之前的服务器ID
验证失败返回上面的JSON错误即可,成功返回
{ "id"=>"用户UUID", "name'=>"用户名称" }
到此一个简单的快速验证已经完成了,然后你会发现实际上这些地址请求是mojang的对吧
1.启动器端:自带第三方验证地址可以填上你的地址,如果没有可以自己写个启动器修改验证地址
2.游戏客户端:在.minecraft\libraries\com\mojang\authlib\1.5.25\authlib-1.5.25.jar里面可以用压缩包解包后找到YggdrasilMinecraftSessionService.class文件然后将里面的地址找二进制字符串修改工具根据你的API修改一共有4处
3.游戏BC服务端:在BC服务端核心文件中找到InitialHandler.class修改join地址即可
修改jar包可以选择自己重新构建jar包文件
https://github.com/yushijinhun/authlib-injector
https://github.com/SpigotMC/BungeeCord/
authlib我是直接修改二进制字符串的,BC我是直接构建代码的
搜索https://sessionserver.mojang.com/session/minecraft/hasJoined将地址修改为你的hasJoined地址
关于离线账号的UUID计算方式(PHP版)
function getOffineUUID($playerName){ $playerName = "OfflinePlayer:{$playerName}"; $hash = getBytes(md5($playerName,true)); $hash[6] &= 0x0f; $hash[6] |= 0x30; $hash[8] &= 0x3f; $hash[8] |= 0x80; $s = ''; foreach ($hash as $h){ $st = dechex($h); $s .= str_pad($st,2,"0",STR_PAD_LEFT); } return $s; } function getBytes($string) { $bytes = array(); for($i = 0; $i < strlen($string); $i++){ $bytes[] = ord($string[$i]); } return $bytes; }
参考:
https://printempw.github.io/minecraft-yggdrasil-api-third-party-implementation/
https://github.com/yushijinhun/yggdrasil-mock
2条评论登录后可见