using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using LingAdmin.IdentityService.Services;
using LingAdmin.Shared.DTOs;
using System.Security.Claims;
namespace LingAdmin.IdentityService.Controllers;
///
/// 认证控制器 - 处理用户注册、登录、令牌刷新等
///
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IAuthService _authService;
private readonly ILogger _logger;
public AuthController(IAuthService authService, ILogger logger)
{
_authService = authService;
_logger = logger;
}
///
/// 用户注册
///
[HttpPost("register")]
public async Task>> Register([FromBody] RegisterRequest request)
{
var (user, error) = await _authService.RegisterAsync(request);
if (error != null)
{
return BadRequest(ApiResponse.Error(error));
}
var userDto = new UserDto
{
Id = user!.Id,
Name = user.Name,
Email = user.Email,
Status = user.Status,
CreatedAt = user.CreatedAt
};
return CreatedAtAction(nameof(GetProfile), null, ApiResponse.Created(userDto, "Registration successful"));
}
///
/// 用户登录
///
[HttpPost("login")]
public async Task>> Login([FromBody] LoginRequest request)
{
var ipAddress = GetIpAddress();
var (response, error) = await _authService.LoginAsync(request, ipAddress);
if (error != null)
{
return Unauthorized(ApiResponse.Unauthorized(error));
}
SetRefreshTokenCookie(response!.RefreshToken);
return Ok(ApiResponse.Ok(response, "Login successful"));
}
///
/// 刷新访问令牌
///
[HttpPost("refresh-token")]
public async Task>> RefreshToken([FromBody] RefreshTokenRequest? request = null)
{
var refreshToken = request?.RefreshToken ?? Request.Cookies["refreshToken"];
if (string.IsNullOrEmpty(refreshToken))
{
return BadRequest(ApiResponse.Error("Refresh token is required"));
}
var ipAddress = GetIpAddress();
var (response, error) = await _authService.RefreshTokenAsync(refreshToken, ipAddress);
if (error != null)
{
return Unauthorized(ApiResponse.Unauthorized(error));
}
SetRefreshTokenCookie(response!.RefreshToken);
return Ok(ApiResponse.Ok(response));
}
///
/// 登出(撤销刷新令牌)
///
[HttpPost("logout")]
public async Task>> Logout([FromBody] RefreshTokenRequest? request = null)
{
var refreshToken = request?.RefreshToken ?? Request.Cookies["refreshToken"];
if (string.IsNullOrEmpty(refreshToken))
{
return BadRequest(ApiResponse