feat(auth): add user information update feature and refactor the authentication service.

This commit is contained in:
ShiYu
2025-05-20 20:43:08 +08:00
parent 2c73fc29df
commit 97e3586cf8
10 changed files with 507 additions and 246 deletions

View File

@@ -8,7 +8,7 @@ using Foxel.Models.Response.Auth;
namespace Foxel.Controllers;
[Route("api/auth")]
public class AuthController(IUserService userService, IConfigService configService) : BaseApiController
public class AuthController(IAuthService authService, IConfigService configService) : BaseApiController
{
[HttpPost("register")]
public async Task<ActionResult<BaseResult<AuthResponse>>> Register([FromBody] RegisterRequest request)
@@ -18,13 +18,13 @@ public class AuthController(IUserService userService, IConfigService configServi
return Error<AuthResponse>("请求数据无效");
}
var (success, message, user) = await userService.RegisterUserAsync(request);
var (success, message, user) = await authService.RegisterUserAsync(request);
if (!success)
{
return Error<AuthResponse>(message);
}
var token = await userService.GenerateJwtTokenAsync(user!);
var token = await authService.GenerateJwtTokenAsync(user!);
var response = new AuthResponse
{
Token = token,
@@ -48,13 +48,13 @@ public class AuthController(IUserService userService, IConfigService configServi
return Error<AuthResponse>("请求数据无效");
}
var (success, message, user) = await userService.AuthenticateUserAsync(request);
var (success, message, user) = await authService.AuthenticateUserAsync(request);
if (!success)
{
return Error<AuthResponse>(message, 401);
}
var token = await userService.GenerateJwtTokenAsync(user!);
var token = await authService.GenerateJwtTokenAsync(user!);
var response = new AuthResponse
{
Token = token,
@@ -80,7 +80,7 @@ public class AuthController(IUserService userService, IConfigService configServi
return Error<UserProfile>("用户ID未找到");
}
var user = await userService.GetUserByIdAsync(userId.Value);
var user = await authService.GetUserByIdAsync(userId.Value);
if (user == null)
{
return Error<UserProfile>("未找到用户信息", 404);
@@ -100,108 +100,52 @@ public class AuthController(IUserService userService, IConfigService configServi
[HttpGet("github/login")]
public IActionResult GitHubLogin()
{
string githubClientId = configService["Authentication:GitHubClientId"];
string githubCallback = configService["Authentication:GitHubCallbackUrl"];
string githubAuthorizeUrl =
$"https://github.com/login/oauth/authorize?client_id={Uri.EscapeDataString(githubClientId)}&redirect_uri={Uri.EscapeDataString(githubCallback)}";
string githubAuthorizeUrl = authService.GetGitHubLoginUrl();
return Redirect(githubAuthorizeUrl);
}
[HttpGet("github/callback")]
public async Task<ActionResult<BaseResult<string>>> GitHubCallback(string code)
{
if (string.IsNullOrEmpty(code))
var (success, message, token) = await authService.ProcessGitHubCallbackAsync(code);
if (!success || token == null)
{
return Error<string>("GitHub授权码无效");
return Redirect($"/login?error=github_auth_failed&message={Uri.EscapeDataString(message)}");
}
string githubClientId = configService["Authentication:GitHubClientId"];
string githubClientSecret = configService["Authentication:GitHubClientSecret"];
string githubTokenUrl = "https://github.com/login/oauth/access_token";
string githubUserApiUrl = "https://api.github.com/user";
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Foxel");
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
var tokenRequestUrl =
$"{githubTokenUrl}?client_id={Uri.EscapeDataString(githubClientId)}&client_secret={Uri.EscapeDataString(githubClientSecret)}&code={Uri.EscapeDataString(code)}";
var tokenResponse = await httpClient.PostAsync(tokenRequestUrl, null);
if (!tokenResponse.IsSuccessStatusCode)
{
var errorContent = await tokenResponse.Content.ReadAsStringAsync();
Console.WriteLine($"获取GitHub访问令牌失败: {tokenResponse.StatusCode}, {errorContent}");
return Error<string>($"获取GitHub访问令牌失败: {errorContent}", (int)tokenResponse.StatusCode);
}
var tokenResponseContent = await tokenResponse.Content.ReadAsStringAsync();
var tokenJson = System.Text.Json.JsonDocument.Parse(tokenResponseContent);
if (!tokenJson.RootElement.TryGetProperty("access_token", out var accessTokenElement) ||
accessTokenElement.GetString() == null)
{
Console.WriteLine($"GitHub响应中未找到access_token: {tokenResponseContent}");
return Error<string>("获取GitHub访问令牌失败响应中未包含令牌。");
}
var accessToken = accessTokenElement.GetString();
httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
var userResponse = await httpClient.GetAsync(githubUserApiUrl);
if (!userResponse.IsSuccessStatusCode)
{
var errorContent = await userResponse.Content.ReadAsStringAsync();
Console.WriteLine($"获取GitHub用户信息失败: {userResponse.StatusCode}, {errorContent}");
return Error<string>($"获取GitHub用户信息失败: {errorContent}", (int)userResponse.StatusCode);
}
var userContent = await userResponse.Content.ReadAsStringAsync();
var userJson = System.Text.Json.JsonDocument.Parse(userContent);
string? githubUserId = null;
string? email = null;
string? name = null;
string? loginName = null;
if (userJson.RootElement.TryGetProperty("id", out var idElement))
{
githubUserId = idElement.GetInt64().ToString();
}
if (userJson.RootElement.TryGetProperty("email", out var emailElement))
{
email = emailElement.GetString();
}
if (userJson.RootElement.TryGetProperty("name", out var nameElement))
{
name = nameElement.GetString();
}
if (userJson.RootElement.TryGetProperty("login", out var loginElement))
{
loginName = loginElement.GetString();
}
if (string.IsNullOrEmpty(githubUserId))
{
return Error<string>("无法从GitHub获取用户ID");
}
var (isSuccess, message, user) =
await userService.FindOrCreateGitHubUserAsync(githubUserId, name ?? loginName, email);
if (!isSuccess || user == null)
{
Console.WriteLine($"创建或查找GitHub用户失败: {message}");
return Redirect(
$"/login?error=github_user_creation_failed&message={Uri.EscapeDataString(message)}");
}
var token = await userService.GenerateJwtTokenAsync(user);
return Redirect($"/login?token={Uri.EscapeDataString(token)}");
}
[HttpPut("update")]
[Authorize]
public async Task<ActionResult<BaseResult<UserProfile>>> UpdateUserInfo([FromBody] UpdateUserRequest request)
{
if (!ModelState.IsValid)
{
return Error<UserProfile>("请求数据无效");
}
var userId = GetCurrentUserId();
if (userId == null)
{
return Error<UserProfile>("用户ID未找到");
}
var (success, message, user) = await authService.UpdateUserInfoAsync(userId.Value, request);
if (!success || user == null)
{
return Error<UserProfile>(message);
}
var profile = new UserProfile
{
Id = user.Id,
Email = user.Email,
UserName = user.UserName,
RoleName = user.Role?.Name
};
return Success(profile, "用户信息更新成功");
}
}