七空幻音LOGO

七空幻音

Minecraft快速实现Yggdrasil API正版验证2020-02-15 18:12:58

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请求

  1. 首先第一步启动器那边输入账号密码后会调用/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我是直接构建代码的

2020021518043891188搜索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

https://wiki.vg/Authentication

https://wiki.vg/Mojang_API

2条评论登录后可见

详细图片
载入中...