2014年巴西世界杯_田径世界杯 - dutugo.com

Minecraft使用Microsoft账号登录游戏具体流程

Microsoft 身份验证

有关 API 文档,请参阅 Mojang API。

从2022年7月开始,旧版Mojang账号将无法登录游戏,需要使用Microsoft账号来登录。

使用微软账号登录Minecraft需要进行前四个步骤来获取Minecraft访问令牌。

目录Microsoft 身份验证获取Microsoft令牌进行XBL身份验证(获取Xbox Live令牌)获取XSTS令牌获取Minecraft访问令牌验证是否购买游戏获取玩家信息

获取Microsoft令牌

在开始之前,你需要创建Microsoft Azure应用程序来获取一个OAuth 2.0 客户端 ID,然后你就可以使用授权代码流、设备代码流、隐式授权流等方式来获取Microsoft令牌。

无论使用何种方式,你都需要在scope参数中包含XboxLive.signin,否则在下一个步骤将会报错,并且错误信息并不会给你任何帮助!

根据此文章所述,创建的Microsoft Azure应用程序必须在此表单申请可以调用Minecraft API的权限,如果应用程序没有被授权,将会在访问api.minecraftservices.com时返回403。

以下为使用隐式授权流获取令牌的方法:

使用浏览器访问https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=<客户端ID>&response_type=token&redirect_uri=<回调URI>&scope=XboxLive.signin offline_access&state=<可选状态值>&response_mode=fragment

在打开的页面登录Microsoft账户,登录成功会回跳转回调URI,例如URI为https://127.0.0.1,跳转的页面为https://127.0.0.1/#access_token=&token_type=bearer&expires_in=3600&scope=XboxLive.signin&state=<可选状态值>

你需要手动保存或编写自定义网页提取Microsoft令牌来进行下一步骤。

其他方式获取Microsoft令牌请阅读Microsoft官方文档。

进行XBL身份验证(获取Xbox Live令牌)

进行此步骤的前提是已经获得Microsoft令牌。

发送如下请求:

POST https://user.auth.xboxlive.com/user/authenticate

Content-Type: application/json

Accept: application/json

{

"Properties": {

"AuthMethod": "RPS",

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

"RpsTicket": "d=" // 在上一步中获取的令牌,请保留前缀d=

},

"RelyingParty": "http://auth.xboxlive.com",

"TokenType": "JWT"

}

你需要设置Content-Type: application/json和Accept: application/json,并且确保你的 SSL 实现支持 SSL 重新协商,否则就会出现错误。

返回如下:

{

"IssueInstant": "2020-12-07T19:52:08.4463796Z",

"NotAfter": "2020-12-21T19:52:08.4463796Z",

"Token": "token", // XBL令牌

"DisplayClaims": {

"xui": [

{

"uhs": "userhash" // 用户哈希值

}

]

}

}

注意:你需要保存其中的XBL令牌和用户哈希值

获取XSTS令牌

获取XBL令牌后,我们需要用此令牌来获取XSTS令牌

发送如下请求:

POST https://xsts.auth.xboxlive.com/xsts/authorize

Content-Type: application/json

Accept: application/json

{

"Properties": {

"SandboxId": "RETAIL",

"UserTokens": [

"xbl_token" // XBL令牌

]

},

"RelyingParty": "rp://api.minecraftservices.com/",

"TokenType": "JWT"

}

如需获取用于Bedrock Realms API的XSTS令牌 , 需提交:

{

"Properties": {

"SandboxId": "RETAIL",

"UserTokens": [

"xbl_token" // XBL令牌

]

},

"RelyingParty": "https://pocket.realms.minecraft.net/",

"TokenType": "JWT"

}

返回如下:

{

"IssueInstant": "2020-12-07T19:52:09.2345095Z",

"NotAfter": "2020-12-08T11:52:09.2345095Z",

"Token": "token", // XSTS令牌

"DisplayClaims": {

"xui": [

{

"uhs": "userhash" // 用户哈希值,应与上一步骤中的用户哈希值相同

}

]

}

}

可能会返回401报错:

{

"Identity": "0",

"XErr": 2148916238,

"Message": "",

"Redirect": "https://start.ui.xboxlive.com/AddChildToFamily"

}

Redirect参数通常无法在浏览器中正常跳转,该功能主要针对Xbox主机设计

XErr代码解析:

2148916227: 账号已被Xbox封禁

2148916233: 账号未注册Xbox。需通过minecraft.net登录创建(注:已购买Minecraft的微软账户应已完成此步骤)

2148916235: 账号所属国家/地区不支持Xbox Live服务

2148916236: 需在Xbox页面完成成人验证(韩国)

2148916237: 需在Xbox页面完成成人验证(韩国)

2148916238: 未成年账户(未满18岁),必须由成人账户添加到家庭组才能继续。此错误通常仅在使用自定义Azure应用时出现,官方Minecraft启动器客户端ID不会触发此限制

2148916262: 未知错误(很少)

至此即可完成 Bedrock Realms 的验证, 它直接使用 XSTS令牌 ,而不是使用单独的身份验证方案

获取Minecraft访问令牌

至此,我们可以与Minecraft验证服务器进行交互,从此步骤开始,你需要拥有调用Minecraft API的权限,如没有权限,将会返回403

发送如下请求:

POST https://api.minecraftservices.com/authentication/login_with_xbox

Content-Type: application/json

Accept: application/json

{

"identityToken": "XBL3.0 x=<用户哈希值>;"

}

返回如下

{

"username": "some uuid", // 非账户真实UUID

"roles": [],

"access_token": "minecraft access token", // jwt,即传统MC令牌

"token_type": "Bearer",

"expires_in": 86400

}

保存Minecraft令牌,此令牌可用于启动游戏

以上步骤仅需一个普通的Microsoft账号即可完成,并不会验证是否购买游戏

验证是否购买游戏

使用Minecraft令牌来验证是否购买游戏

发送:

GET https://api.minecraftservices.com/entitlements/mcstore

Authorization: Bearer

如果该账户购买了游戏,将返回:

{

"items": [

{

"name": "product_minecraft",

"signature": "jwt sig"

},

{

"name": "game_minecraft",

"signature": "jwt sig"

}

],

"signature": "jwt sig",

"keyId": "1"

}

如果账户未拥有游戏,items将为空:

{

"items": [],

"signature": "jwt sig",

"keyId": "1"

}

注意,Xbox Game Pass用户在技术上并不拥有游戏,虽然能正常生成Minecraft角色档案,但此处仍返回空

注意,必须使用 Mojang 官方公钥验证签名,以确保响应确实来自合法服务器,而非伪造或篡改的数据:

-----BEGIN PUBLIC KEY-----

MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtz7jy4jRH3psj5AbVS6W

NHjniqlr/f5JDly2M8OKGK81nPEq765tJuSILOWrC3KQRvHJIhf84+ekMGH7iGlO

4DPGDVb6hBGoMMBhCq2jkBjuJ7fVi3oOxy5EsA/IQqa69e55ugM+GJKUndLyHeNn

X6RzRzDT4tX/i68WJikwL8rR8Jq49aVJlIEFT6F+1rDQdU2qcpfT04CBYLM5gMxE

fWRl6u1PNQixz8vSOv8pA6hB2DU8Y08VvbK7X2ls+BiS3wqqj3nyVWqoxrwVKiXR

kIqIyIAedYDFSaIq5vbmnVtIonWQPeug4/0spLQoWnTUpXRZe2/+uAKN1RY9mmaB

pRFV/Osz3PDOoICGb5AZ0asLFf/qEvGJ+di6Ltt8/aaoBuVw+7fnTw2BhkhSq1S/

va6LxHZGXE9wsLj4CN8mZXHfwVD9QG0VNQTUgEGZ4ngf7+0u30p7mPt5sYy3H+Fm

sWXqFZn55pecmrgNLqtETPWMNpWc2fJu/qqnxE9o2tBGy/MqJiw3iLYxf7U+4le4

jM49AUKrO16bD1rdFwyVuNaTefObKjEMTX9gyVUF6o7oDEItp5NHxFm3CqnQRmch

HsMs+NxEnN4E9a8PDB23b4yjKOQ9VHDxBxuaZJU60GBCIOF9tslb7OAkheSJx5Xy

EYblHbogFGPRFU++NrSQRX0CAwEAAQ==

-----END PUBLIC KEY-----

更多细节请查阅 JWT 标准

如果公钥发生变化,可以从启动器库中提取:

strings ~/.minecraft/launcher/liblauncher.so > launcher-strings.txt

创建的文件launcher-strings.txt 将包含两个公钥字符串,以 -----BEGIN PUBLIC KEY----- 开始,以 -----END PUBLIC KEY-----结束

第一个密钥用于校验 Minecraft 服务端返回的 JWT 令牌签名, 第二个密钥的用途到目前为止未知

获取玩家信息

GET https://api.minecraftservices.com/minecraft/profile

Authorization: Bearer

返回如下:

{

"id": "986dec87b7ec47ff89ff033fdb95c4b5", // 用户的UUID

"name": "HowDoesAuthWork", // 账户的Minecraft用户名

"skins": [

{

"id": "6a6e65e5-76dd-4c3c-a625-162924514568",

"state": "ACTIVE",

"url": "http://textures.minecraft.net/texture/1a4af718455d4aab528e7a61f86fa25e6a369d1768dcb13f7df319a713eb810b",

"variant": "CLASSIC",

"alias": "STEVE"

}

],

"capes": [

{

"id": "5af20372-79e0-4e1f-80f8-6bd8e3135995",

"state": "ACTIVE",

"url": "http://textures.minecraft.net/texture/2340c0e03dd24a11b15a8b33c2a7e9e32abb2051b2481d0ba7defd635ca7a933",

"alias": "Migrator"

}

]

}

请求失败将返回:

{

"path": "/minecraft/profile",

"error": "NOT_FOUND",

"errorMessage": "The server has not found anything matching the request URI"

}

没有登录过Minecraft启动器的Xbox Game Pass用户将不会返回配置文件,需要在激活Xbox Game Pass后登录一次新版Minecraft启动器来激活Minecraft档案

至此,现在已经拥有启动游戏所需的所有数据(Minecraft访问令牌、用户名和UUID)了

开发例子:

minecraft_auth.py: 模拟官方启动器的认证方式(即授权代码流)并支持刷新令牌请求.

一个完整的 Kotlin 实现(使用设备代码流)可以在这里找到.

基于设备代码流的完整Java命令行封装实现参见此项目

一个基于 Java 的简易实现示例(使用 JavaFX 及其 WebView 组件)可在此处查看.

一个功能完整的 Java 库(支持 4 种登录流程)可在此处获取.

一个Go语言的实现可以在这里找到.

一个JS实现可以在这里找到,另一个使用JS/TS的实现参见此处.

一个Python的实现可以在这里找到.

一个Rust语言的实现可以在这里找到.

一个支持 JVM 和 JS 平台的 Kotlin 库可在此处获取.

一个使用WebView和MSAL.NET(微软身份验证库.NET版)的C#库可以在这里找到

一个 Rust 库可以在这里找到.

一个PHP库可以在这里找到.

一个易语言实现可以在这里找到.