Minecraft快速实现Yggdrasil API正版验证
- 2020-02-15 10:12:58
- 幻音い
- 16521
温馨提示: 这篇文章于1740天前编写,现在可能不再适用或落后.
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
阁下需要登录后才可以查看评论哦~