Skip to content
This repository was archived by the owner on Aug 30, 2025. It is now read-only.

Commit 3e2d383

Browse files
committed
sync code
1 parent 17227e6 commit 3e2d383

File tree

27 files changed

+646
-716
lines changed

27 files changed

+646
-716
lines changed

.idea/.idea.SuikaiLauncher.Core/.idea/workspace.xml

Lines changed: 24 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/profiles_settings.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,75 @@
1+
using System.ComponentModel;
12
using SuikaiLauncher.Core.Account.JsonModel;
23
using SuikaiLauncher.Core.Base;
34
using SuikaiLauncher.Core.Override;
4-
using System.Runtime.CompilerServices;
55

6+
namespace SuikaiLauncher.Core.Account.Modules;
67

7-
namespace SuikaiLauncher.Core.Account
8+
public class Microsoft
89
{
9-
public class Microsoft
10+
public enum LoginState
1011
{
11-
public static Action<Dictionary<string, string>>? Callback;
12-
public static string?ClientId;
13-
public async static Task GetDeviceCode()
12+
Success,
13+
Error,
14+
Pending
15+
}
16+
public class MSLoginResult
17+
{
18+
public LoginState? State;
19+
public string? Description;
20+
internal string? AccessToken;
21+
internal string? RefreshToken;
22+
}
23+
public static async Task<MicrosoftOAuthCode> GetOAuthCode()
24+
{
25+
using (MemoryStream ReqStream = new("client_id=&scope=XboxLive.Signin offline_access".GetBytes()))
1426
{
15-
using(MemoryStream ReqData = new($"client_id={ClientId}&scope=XboxLive.Signin%20offline_access".GetBytes()))
27+
try
1628
{
17-
HttpResponseMessage? Resp = (await HttpRequestBuilder
18-
.Create("https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode", HttpMethod.Post)
19-
.WithRequestData(ReqData)
20-
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
21-
.SetHeader("Accept","application/json")
22-
.SetHeader("User-Agent",HttpRequestBuilder.UserAgent)
23-
.UseProxy()
24-
.Invoke()).GetResponse();
25-
OAuthDeviceCode DeviceCode = Json.Deserialize<OAuthDeviceCode>(await FileIO.ReadAsString(Resp));
26-
if (Callback is not null) Callback(new Dictionary<string, string>()
27-
{
28-
["user_code"] = DeviceCode.UserCode,
29-
["verification_uri"] = DeviceCode.Verification,
30-
["verification_uri_complete"] = DeviceCode.VerificationComplete ?? string.Empty
31-
});
32-
29+
HttpResponseMessage Response = await HttpRequestBuilder
30+
.Create("https://login.microsoftonline.com/consumers/oauth2/v2.0/device_code", HttpMethod.Post)
31+
.WithRequestData(ReqStream)
32+
.GetResponse();
33+
return Json.Deserialize<MicrosoftOAuthCode>(await FileIO.ReadAsString(Response));
34+
}
35+
catch (HttpRequestException ex)
36+
{
37+
Logger.Log(ex,"[Account] Microsoft 登录失败");
3338
}
34-
35-
return;
3639
}
37-
public async static Task ValidateUserAuthorizeResult(OAuthDeviceCode DeviceCode)
40+
}
41+
42+
public static async Task<MSLoginResult> ValidateUserAuthorizeResult(MicrosoftOAuthCode DeviceResult)
43+
{
44+
await Task.Delay(DeviceResult.Interval);
45+
using (MemoryStream ReqStream = new("client_id=&device_code=&scope=XboxLive.Signin offline_access".GetBytes()))
3846
{
39-
using (MemoryStream ReqData = new("device_code=&client_id=&".GetBytes()))
47+
HttpResponseMessage Response = await HttpRequestBuilder
48+
.Create("https://login.microsoftonline.com/consumers/oauth2/v2.0/device_code", HttpMethod.Get)
49+
.WithRequestData(ReqStream)
50+
.GetResponse(false);
51+
MicrosoftAuthorizeResult Result = Json.Deserialize<MicrosoftAuthorizeResult>(await FileIO.ReadAsString(Response));
52+
MSLoginResult LoginResult = new();
53+
if (Result.Error is not null)
4054
{
41-
HttpResponseMessage? Resp = (await HttpRequestBuilder
42-
.Create("https://login.microsoftonline.com/consumers/oauth2/v2.0/token", HttpMethod.Post)
43-
.WithRequestData(ReqData)
44-
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
45-
.SetHeader("Accept", "application/json")
46-
.SetHeader("User-Agent", HttpRequestBuilder.UserAgent)
47-
.Invoke()).GetResponse(false);
55+
LoginResult.State = LoginState.Error;
56+
switch (Result.Error)
57+
{
58+
case "authorization_declined":
59+
LoginResult.Description = "你拒绝了授权请求";
60+
break;
61+
case "authorization_pending":
62+
LoginResult.State = LoginState.Pending;
63+
break;
64+
case "invalid_grant":
65+
if (Result.Description.ContainsF("AADSTS70000"))
66+
{
67+
LoginResult.Description =
68+
"${support,gid=10}需要使用密码登录\n\n请在登录时选择其他登录方法,然后选择使用我的密码{vbRQ}。\n如果没有该选项,请选择设置密码,设置完毕后再登录。\n如果不知道如何操作,请查阅支持文档。";
69+
return LoginResult;
70+
}
71+
}
4872
}
4973
}
5074
}
51-
}
75+
}

SuikaiLauncher.Core.Account/Modules/MinecraftYggdrasil.cs

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,38 @@
55

66
namespace SuikaiLauncher.Core.Account{
77
public class MinecraftYggdrasil{
8-
internal async Task<Tuple<bool,string>> YggdrasilAuthorize(string XSTSToken,string UserHash){
9-
MinecraftRPLogin AuthData = new() { identityToken = $"XBL3.0 x={XSTSToken};{UserHash}" };
10-
string LoginData = Json.Serialize<MinecraftRPLogin>(AuthData);
11-
using (MemoryStream ReqData = new(LoginData.GetBytes()))
8+
internal static async Task<Tuple<bool, string>> YggdrasilAuthorize(string XSTSToken, string UserHash)
9+
{
10+
JsonObject ReqData = new()
1211
{
13-
HttpResponseMessage Response = (await HttpRequestBuilder
12+
["JsonProperty"] = $"XBL3.0 x={XSTSToken};{UserHash}"
13+
};
14+
using (MemoryStream ReqStream = new MemoryStream(ReqData.ToJsonString().GetBytes()))
15+
{
16+
HttpResponseMessage Response = await HttpRequestBuilder
1417
.Create("https://api.minecraftservices.com/authentication/login_with_xbox", HttpMethod.Post)
15-
.WithRequestData(ReqData)
18+
.WithRequestData(ReqStream)
1619
.SetHeader("Content-Type", "application/json")
17-
.SetHeader("Accept", "application/json")
18-
.SetHeader("UserAgent", HttpRequestBuilder.UserAgent)
19-
.UseProxy()
20-
.Invoke()).GetResponse();
21-
22-
23-
string UserAuthResult = await FileIO.ReadAsString(Response!);
24-
if (!UserAuthResult.IsNullOrWhiteSpaceF())
25-
{
26-
MinecraftOfficialYggdrasil JsonData = Json.Deserialize<MinecraftOfficialYggdrasil>(UserAuthResult);
27-
return Tuple.Create(true, JsonData.accessToken);
28-
}
29-
}
30-
return Tuple.Create(false, string.Empty);
20+
.GetResponse();
21+
string accessToken = Json.Deserialize<MinecraftOfficialYggdrasil>(await FileIO.ReadAsString(Response)).accessToken;
22+
return Tuple.Create(true, accessToken);
3123
}
32-
internal async static Task<bool> ValidateOwnership(string AccessToken){
33-
HttpResponseMessage Response = (await HttpRequestBuilder
34-
.Create("https://api.minecraftservices.com/entitlements/mcstore", HttpMethod.Get)
35-
.SetHeader("Authorization", AccessToken)
36-
.SetHeader("User-Agent", HttpRequestBuilder.UserAgent)
37-
.UseProxy()
38-
.Invoke()).GetResponse();
24+
}
25+
26+
internal static async Task<bool> ValidateOwnership(string AccessToken){
27+
HttpResponseMessage Response = await HttpRequestBuilder
28+
.Create("https://api.minecraftservices.com/entitlements/mcstore",HttpMethod.Get)
29+
.SetHeader("Authorization", $"Bearer {AccessToken}")
30+
.GetResponse();
3931
Ownership UserAuthResult = Json.Deserialize<Ownership>(await FileIO.ReadAsString(Response));
4032
return !(UserAuthResult.items.Count <= 0);
4133
}
4234
internal async static Task<MinecraftUserProfile?> GetMinecraftProfile(string AccessToken){
4335
try{
44-
HttpResponseMessage Response = (await HttpRequestBuilder
45-
.Create("https://api.minecraftservices.com/minecraft/profile", HttpMethod.Get)
46-
.SetHeader("Authorization", AccessToken)
47-
.SetHeader("User-Agent", HttpRequestBuilder.UserAgent)
48-
.UseProxy()
49-
.Invoke()).GetResponse();
50-
36+
HttpResponseMessage Response = await HttpRequestBuilder
37+
.Create("https://api.minecraftservices.com/minecraft/profile",HttpMethod.Get)
38+
.SetHeader("Authorization", $"Bearer {AccessToken}")
39+
.GetResponse();
5140
MinecraftUserProfile PlayerProfile = Json.Deserialize<MinecraftUserProfile>(await FileIO.ReadAsString(Response));
5241
return PlayerProfile;
5342
}catch (Exception ex){

0 commit comments

Comments
 (0)