scl_core/auth/
structs.rs

1//! 登录验证数据结构
2use serde::{Deserialize, Serialize};
3
4use crate::password::Password;
5
6/**
7   账户类型枚举,需要提供一个账户种类方可启动游戏
8*/
9#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
10pub enum AuthMethod {
11    /// 离线账户登录
12    Offline {
13        /// 离线玩家的名称
14        player_name: String,
15        /// 离线玩家的统一标识,如果玩家是从其它启动器迁移到使用本启动模块的启动器的,需要提供这个以确保存档物品信息能够正确读取
16        uuid: String,
17    },
18    /// Mojang (Yggdrasil) 账户登录
19    Mojang {
20        /// 登录令牌,将会作为启动参数的一部分传入游戏实例
21        access_token: Password,
22        /// 正版玩家的统一标识
23        uuid: String,
24        /// 正版玩家的名称
25        player_name: String,
26        /// 正版玩家的头部皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
27        head_skin: Vec<u8>,
28        /// 正版玩家的头发皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
29        hat_skin: Vec<u8>,
30    },
31    /// 微软账户
32    Microsoft {
33        /// 登录令牌,将会作为启动参数的一部分传入游戏实例
34        access_token: Password,
35        /// 刷新令牌,校验/更新登录令牌时实现携带这个作为参数
36        refresh_token: Password,
37        /// 正版玩家的统一标识
38        uuid: String,
39        /// 正版玩家的 XBox 用户 ID,用途不明,但是在新版本的 Minecraft 有发现需要使用这个 XUID 的地方
40        xuid: String,
41        /// 正版玩家的名称
42        player_name: String,
43        /// 正版玩家的头部皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
44        head_skin: Vec<u8>,
45        /// 正版玩家的头发皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
46        hat_skin: Vec<u8>,
47    },
48    /// 外置登录(Authlib-Injector)
49    AuthlibInjector {
50        /// 第三方登录 API 提供方的 API 链接,登录的请求将通过这个 API 发送
51        api_location: String,
52        /// 第三方登录 API 提供方的服务器名称,用于 GUI 显示
53        server_name: String,
54        /// 第三方登录 API 提供方的网页主页,用于 GUI 显示跳转
55        server_homepage: String,
56        /// 第三方登录 API 提供方的元数据,需要在启动时携带这个作为参数
57        server_meta: String,
58        /// 第三方登录令牌,将会作为启动参数的一部分传入游戏实例
59        access_token: Password,
60        /// 第三方正版玩家的统一标识
61        uuid: String,
62        /// 第三方正版玩家的名称
63        player_name: String,
64        /// 第三方正版玩家的头部皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
65        head_skin: Vec<u8>,
66        /// 第三方正版玩家的头发皮肤位图信息,格式为 RGBA,大小为 8x8,用于展示头像
67        hat_skin: Vec<u8>,
68    },
69}
70
71pub(crate) mod mojang {
72    use serde::{Deserialize, Serialize};
73
74    use crate::password::Password;
75
76    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
77    #[serde(rename_all = "camelCase")]
78    pub(crate) struct AuthenticateBody {
79        pub agent: AuthenticateAgent,
80        pub username: String,
81        pub password: Password,
82        #[serde(skip_serializing_if = "String::is_empty")]
83        pub client_token: String,
84        pub request_user: bool,
85    }
86
87    impl Default for AuthenticateBody {
88        fn default() -> Self {
89            Self {
90                request_user: true,
91                username: "".into(),
92                password: "".into(),
93                client_token: "".into(),
94                agent: Default::default(),
95            }
96        }
97    }
98
99    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
100    pub(crate) struct AuthenticateAgent {
101        pub name: String,
102        pub version: usize,
103    }
104
105    impl Default for AuthenticateAgent {
106        fn default() -> Self {
107            Self {
108                name: "Minecraft".into(),
109                version: 1,
110            }
111        }
112    }
113
114    #[derive(Debug, Deserialize, PartialEq, Eq)]
115    #[serde(rename_all = "camelCase")]
116    pub(crate) struct AuthenticateResponse {
117        pub access_token: Password,
118        pub client_token: String,
119        pub available_profiles: Vec<AvaliableProfile>,
120        pub selected_profile: Option<AvaliableProfile>,
121    }
122
123    #[derive(Debug, Serialize, PartialEq, Eq)]
124    #[serde(rename_all = "camelCase")]
125    pub(crate) struct ValidateResponse {
126        pub access_token: Password,
127        pub client_token: String,
128    }
129
130    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
131    pub(crate) struct AvaliableProfile {
132        pub name: String,
133        pub id: String,
134    }
135
136    /// 来自 Mojang 或第三方正版登录传回的错误响应
137    #[derive(Debug, Deserialize, PartialEq, Eq, Clone, Default)]
138    #[serde(rename_all = "camelCase")]
139    pub struct ErrorResponse {
140        /// 错误的字符串 ID
141        pub error: String,
142        /// 错误的字符串信息,可以展示给用户以确认错误原因
143        pub error_message: String,
144        /// 错误的形成原因,大多数情况这里是空的
145        #[serde(default)]
146        pub cause: String,
147    }
148
149    #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
150    pub(crate) struct ProfileResponse {
151        pub id: String,
152        pub name: String,
153        pub properties: Vec<ProfilePropertie>,
154    }
155
156    #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
157    pub(crate) struct ProfilePropertie {
158        pub name: String,
159        pub value: String,
160    }
161
162    #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
163    #[serde(rename_all = "camelCase")]
164    pub(crate) struct ProfileTexture {
165        pub timestamp: u64,
166        pub profile_id: String,
167        pub profile_name: String,
168        pub textures: Option<TextureData>,
169    }
170
171    #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
172    pub(crate) struct TextureData {
173        #[serde(rename = "SKIN")]
174        pub skin: Option<SkinData>,
175        #[serde(rename = "CAPE")]
176        pub cape: Option<SkinData>,
177    }
178
179    #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
180    pub(crate) struct SkinData {
181        pub url: String,
182    }
183}