# 前言

用 C# 编写的开源 Mojang API Library 已发布至 Github,项目地址:https://github.com/GoodBoyboy666/Mojang-API

# Microsoft 身份验证

由于使用正常的 OAuth 流程十分麻烦,新建的 OAuth 应用程序必须申请使用 Minecraft API 的使用权限,因此这里使用 PCL2 的登录模式进行登录。

大致步骤如下:

  1. 获取 Microsoft 授权代码(一次性)
  2. 使用授权代码获取 Microsoft 令牌
  3. 使用 Microsoft 令牌获取 Xbox Live 令牌
  4. 使用 Xbox Live 令牌获取 XSTS 令牌
  5. 使用 XSTS 令牌获取 Minecraft 令牌

# 获取 Microsoft 授权代码

首先我们需求拼接授权验证页面的 URL 地址:

https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id= + Client_ID + &response_type=code&redirect_uri=https:%2F%2Flogin.live.com%2Foauth20_desktop.srf&response_mode=query&scope=service%3A%3Auser.auth.xboxlive.com%3A%3AMBI_SSL

这里的 Client ID 为 00000000402b5328

因此完整链接为: https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=00000000402b5328&response_type=code&redirect_uri=https:%2F%2Flogin.live.com%2Foauth20_desktop.srf&response_mode=query&scope=service%3A%3Auser.auth.xboxlive.com%3A%3AMBI_SSL

打开链接登录微软账号,完成授权后会跳转到一个空白页面,此时的页面地址应该为: https://login.live.com/oauth20_desktop.srf?code=M.C504_BL2.2.U.xxxxxxxxxxxxxxxxxxxxxx&lc=2052

而我们所需要的 Microsoft 授权代码即为 code 参数内容: M.C504_BL2.2.U.xxxxxxxxxxxxxxxxxxxxxx

该代码为一次性授权代码。

# 获取 Microsoft 令牌

向地址 https://login.live.com/oauth20_token.srf 发送 POST 请求,

Content-Type 为 application/x-www-form-urlencoded

内容为 client_id=00000000402b5328&code= + Microsoft授权代码 + &grant_type=authorization_code&redirect_uri=https%3A%2F%2Flogin.live.com%2Foauth20_desktop.srf&scope=service%3A%3Auser.auth.xboxlive.com%3A%3AMBI_SSL

请求成功后会返回一段 json,找到其中的 access_token 键,其键值为 Microsoft 令牌

# 获取 Xbox Live 令牌

拥有 Microsoft 令牌后开始获取 Xbox Live 令牌。

这里我们需要组建 JSON 内容,实际抓包测试后发现与 wiki 内容有出入,具体结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"Properties": {
"AuthMethod": "RPS",

"SiteName": "user.auth.xboxlive.com",

"RpsTicket": "<access_token>" // Microsoft令牌
},
"RelyingParty": "http://auth.xboxlive.com",

"TokenType": "JWT"
}

然后向 https://user.auth.xboxlive.com/user/authenticate 发送 POST 请求,Content-Type 为 application/json ,内容为上面组建的 JSON。

成功请求后会返回一段 JSON 内容,大致结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"IssueInstant":"xxxxxxxxxxxxxxxxxxx",
"NotAfter":"xxxxxxxxxxxxxxxx",
"Token":"token", // Xbox Live令牌
"DisplayClaims":{
"xui":[
{
"uhs":"xxxxxxxxxx" // User Hash,可以现在保存或者下一步再保存
}
]
}
}

其中 Token 的键值即为 Xbox Live 令牌

# 获取 XSTS 令牌

拥有 Xbox Live 令牌后开始获取 XSTS 令牌。

同样是组建 JSON 内容,具体结构如下:

1
2
3
4
5
6
7
8
9
10
{
"Properties": {
"SandboxId": "RETAIL",
"UserTokens": [
"xbox_live_token" // Xbox Live令牌
]
},
"RelyingParty": "rp://api.minecraftservices.com/",
"TokenType": "JWT"
}

组建完成后向 https://xsts.auth.xboxlive.com/xsts/authorize 发送 POST 请求,Content-Type 为 application/json ,内容如上。

请求成功后返回一段 JSON,大致结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"IssueInstant":"xxxxxxxxxxxxxxxx",
"NotAfter":"xxxxxxxxxxxxxxx",
"Token":"token", // XSTS令牌
"DisplayClaims":{
"xui":[
{
"uhs":"" // 与获取Xbox Live令牌时返回的User Hash相同
}
]
}
}

# 获取 Minecraft 令牌

有 XSTS 令牌和 User Hash 后就可以开始请求最后的 Minecraft 令牌。

同样是组建 JSON,具体结构如下:

1
2
3
{
"identityToken": "XBL3.0 x=<uhs>;<xsts_token>"//<uhs>为User Hash,<xsts_token>为XSTS令牌
}

# 后记

微软这套流程下来我头都秃了。。。

# 参考

Microsoft 身份验证

Minecraft 身份验证

【编程开发】初探新版 Minecraft 正版验证方法