using Apimanager_backend.Dtos; using Apimanager_backend.Exceptions; using Apimanager_backend.Models; using Apimanager_backend.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Apimanager_backend.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class AuthController : ControllerBase { private readonly IAuthService authService; private readonly ITokenService tokenService; private readonly IRefreshTokenService refreshTokenService; private readonly IUserService userService; public AuthController(IAuthService authService, ITokenService tokenService, IRefreshTokenService refreshTokenService,IUserService userService) { this.authService = authService; this.tokenService = tokenService; this.refreshTokenService = refreshTokenService; this.userService = userService; } /// /// 用户登录控制器 /// /// 登录信息 /// 通用返回信息格式 [HttpPost] public async Task>> Login([FromBody] UserLoginDto dto) { try { UserInfoDto user = await authService.LoginAsync(dto.UserName, dto.Password); //生成token string token = tokenService.GenerateAccessToken(user.Id.ToString(),user.Roles); //生成refreshtoken string refreshToken = await refreshTokenService.CreateRefereshTokenAsync(user.Id.ToString()); var responseInfo = new ResponseBase( code: 2000, message: "Login successful", data: new LoginResponseDto { UserInfo = user, Token = token, RefreshToken = refreshToken } ); return Ok(responseInfo); } catch (BaseException e) { //错误时,构建错误信息对象 var responseInfo = new ResponseBase( code: e.code, message: e.message, data: null ); return e.code switch { 2001 => Unauthorized(responseInfo), 2002 => Unauthorized(responseInfo), _ => StatusCode(503) }; } } [HttpPost] public async Task>> Refresh([FromBody]RefreshResponseDto dto) { try { var userId = await refreshTokenService.ValidateRefreshTokenAsync(dto.RefreshToken); //刷新令牌无效 if (userId == null) { var ret = new ResponseBase( code: 2008, message: "Refresh expires or is invalid", data: null ); return Unauthorized(ret); } //获取刷新令牌对应用户信息 var userInfo = await userService.GetUserAsync(int.Parse(userId)); //重新生成令牌 var token = tokenService.GenerateAccessToken(userInfo.Id.ToString(), userInfo.Roles); //刷新刷新令牌有效期(小于三天才会刷新) await refreshTokenService.UpdateRefreshTokenAsync(dto.RefreshToken); var result = new ResponseBase( code: 1000, message: "Success", data: new RefreshResponseDto { Token = token, RefreshToken = dto.RefreshToken } ); return Ok(result); }catch(BaseException e) { } } } }