diff --git a/DysonNetwork.Sphere/Auth/OpenId/AfdianOidcService.cs b/DysonNetwork.Sphere/Auth/OpenId/AfdianOidcService.cs index f07c4f5..3633171 100644 --- a/DysonNetwork.Sphere/Auth/OpenId/AfdianOidcService.cs +++ b/DysonNetwork.Sphere/Auth/OpenId/AfdianOidcService.cs @@ -32,7 +32,7 @@ public class AfdianOidcService( var queryString = string.Join("&", queryParams.Select(p => $"{p.Key}={Uri.EscapeDataString(p.Value)}")); return $"https://afdian.com/oauth2/authorize?{queryString}"; } - + protected override Task GetDiscoveryDocumentAsync() { return Task.FromResult(new OidcDiscoveryDocument @@ -43,7 +43,7 @@ public class AfdianOidcService( JwksUri = null })!; } - + public override async Task ProcessCallbackAsync(OidcCallbackData callbackData) { var tokenResponse = await ExchangeCodeForTokensAsync(callbackData.Code); @@ -60,8 +60,10 @@ public class AfdianOidcService( return userInfo; } - protected override async Task ExchangeCodeForTokensAsync(string code, - string? codeVerifier = null) + protected override async Task ExchangeCodeForTokensAsync( + string code, + string? codeVerifier = null + ) { var config = GetProviderConfig(); var client = HttpClientFactory.CreateClient(); @@ -78,37 +80,44 @@ public class AfdianOidcService( var response = await client.PostAsync("https://afdian.com/api/oauth2/access_token", content); response.EnsureSuccessStatusCode(); - return await response.Content.ReadFromJsonAsync(); + return new OidcTokenResponse() + { + AccessToken = code, + ExpiresIn = 3600 + }; } private async Task GetUserInfoAsync(string accessToken) { + var config = GetProviderConfig(); + var content = new FormUrlEncodedContent(new Dictionary + { + { "client_id", config.ClientId }, + { "client_secret", config.ClientSecret }, + { "grant_type", "authorization_code" }, + { "code", accessToken }, + { "redirect_uri", config.RedirectUri }, + }); + var client = HttpClientFactory.CreateClient(); - var request = new HttpRequestMessage(HttpMethod.Get, "https://discord.com/api/users/@me"); - request.Headers.Add("Authorization", $"Bearer {accessToken}"); + var request = new HttpRequestMessage(HttpMethod.Post, "https://afdian.com/api/oauth2/access_token"); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); - var discordUser = JsonDocument.Parse(json).RootElement; + var afdianUser = JsonDocument.Parse(json).RootElement; - var userId = discordUser.GetProperty("id").GetString() ?? ""; - var avatar = discordUser.TryGetProperty("avatar", out var avatarElement) ? avatarElement.GetString() : null; + var userId = afdianUser.GetProperty("user_id").GetString() ?? ""; + var avatar = afdianUser.TryGetProperty("avatar", out var avatarElement) ? avatarElement.GetString() : null; return new OidcUserInfo { UserId = userId, - Email = (discordUser.TryGetProperty("email", out var emailElement) ? emailElement.GetString() : null) ?? "", - EmailVerified = discordUser.TryGetProperty("verified", out var verifiedElement) && - verifiedElement.GetBoolean(), - DisplayName = (discordUser.TryGetProperty("global_name", out var globalNameElement) - ? globalNameElement.GetString() + DisplayName = (afdianUser.TryGetProperty("name", out var nameElement) + ? nameElement.GetString() : null) ?? "", - PreferredUsername = discordUser.GetProperty("username").GetString() ?? "", - ProfilePictureUrl = !string.IsNullOrEmpty(avatar) - ? $"https://cdn.discordapp.com/avatars/{userId}/{avatar}.png" - : "", + ProfilePictureUrl = avatar, Provider = ProviderName }; }