前言

用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正版验证方法