2019-02-08 | 软件教程 | UNLOCK

Minecraft启动器正版登录原理

前阵子为了给服务器做个启动器,需要正版登录,于是研究了一下这方面的内容…结果百度上是千篇一律的:
“向MOJANG服务器POST账号密码”
那么我们的当前的问题是:
1、接收账号密码的服务器地址/IP是什么
2、POST的格式
至于如何POST数据,百度一搜一把
于是我研究了一下HeyoX的代码,结果…没看懂
又是一番艰苦卓绝的百度,终于发现了一些有用的东西
https://blessing.studio/minecraft-yggdrasil-api-third-party-implementation
原来MOJANG验证系统叫Yggdrasil啊…或许搜这个能有所帮助
于是,发现了神级WIKI,正式我需要的!
https://wiki.vg/Authentication
这里面详细的写了包括登录、刷新、登出等
以下是翻译内容(“(?)是当前无法确定的翻译”):
从 Minecraft 1.6 起引入了一个名为yggdrasil的新认证方案,它完全取代了以前的认证系统。Mojang的另一个游戏——Scrolls,也使用这种身份验证方法。Mojang表示,每个人都应该使用这个认证系统进行自定义登录,但是不应该从用户那里收集凭证。

目录:

  • 1.认证格式
  • 2.错误
  • 3.登录
    • 3.1.端点
    • 3.2.有效负载(?Payload)
    • 3.3.响应
  • 4.刷新
    • 3.1.端点
    • 3.2.有效负载(?Payload)
    • 3.3.响应
  • 5.生效(?Validate)
    • 3.1.端点
    • 3.2.有效负载(?Payload)
    • 3.3.响应
  • 6.登出
    • 3.1.端点
    • 3.2.有效负载(?Payload)
    • 3.3.响应
  • 7.失效
    • 3.1.端点
    • 3.2.有效负载(?Payload)
    • 3.3.响应
  • 8.加入服务器

请求格式

所有发送到ygdrasil的请求都发送到以下服务器:
https://authserver.mojang.com
此外,它们还应遵守以下规则:

  • 是POST请求吗?
  • 将content-type头设置为”application/json”
  • 包含一个JSON编码的字典作为有效负载(?Payload)
    如果请求成功,服务器将响应:
  • HTTP状态码200
  • 在下面有一个符合规范的JSON编码字典
    但是,如果请求失败,服务器将响应:
  • 适当的非200 HTTP状态代码
  • 遵循此格式(见下)的JSON编码字典:
    {
    “error”:”错误的简短描述”,
    “errormessage”:”可以向用户显示的较长描述”,
    “cause”:”错误原因” //可选
    }

错误

以下是可能遇到的一些错误

错误 原因 错误信息 笔记
Method Not Allowed 请求中的方法不允许用于请求URL的资源(?) 发送了除POST以外方法的请求
Not Found 服务器上未找到任何与URL相匹配的内容 发送到了不存在的端点
ForbiddenOperationException 用户迁移异常 无效的凭证。用户已迁移,请使用电子邮件作为用户名
ForbiddenOperationException 无效的凭证。用户名或密码错误
ForbiddenOperationException 无效的凭证 最近使用此用户名进行的登录尝试太多(详见/authenticate)。请注意,用户名和密码可能仍然有效!
ForbiddenOperationException 无效的令牌 accessToken失效
IllegalArgumentException 访问令牌已经分配了一个配置文件 选择配置文件尚未生效
IllegalArgumentException 凭证空 用户名/密码未提交
IllegalArgumentException 无效的salt版本 ???
Unsupported Media Type 服务器拒绝回复请求,因为请求的格式不受请求方法的支持 数据未作为”application/json”提交

登录

使用用户的密码进行登录

端点

/authenticate

有效负载

1
2
3
4
5
6
7
8
9
10
11
12
{
"agent": { //默认是Minecraft
"name": "Minecraft", //为了登录MOJANG的另外一款游戏Scrolls,应该使用"Scrolls"
"version": 1 //数字可能会增长
//未来的普通客户端(?by the vanilla client in the future)
},
"username": "MOJANG账户名", //可以是电子邮件或者玩家名
//未迁移的账户(使用玩家名)
"password": "MOJANG账户的密码",
"clientToken": "客户端标识符(client identifier)", //可选
"requestUser": true //可选,默认: false; 选择true将在响应中加入用户对象
}

clientToken应该是随机生成的标识符,并且对于每个请求都必须是相同的。Vanilla启动程序在第一次运行时生成一个随机的(版本4)的uuid并保存它,在随后的每个请求中都重复使用它。如果它被省略,服务器将基于Java的UUID.toString()生成一个随机令牌,然后由客户端存储。但是,这也会使该用户以前获得的所有客户端访问令牌失效。

未完待续

评论加载中