live-forum/server/webapi/LiveForum/LiveForum.WebApi/Controllers/AuthController.cs
2026-03-24 11:27:37 +08:00

141 lines
5.3 KiB
C#

using LiveForum.Code.Base;
using LiveForum.Code.ExceptionExtend;
using LiveForum.Code.JwtInfrastructure;
using LiveForum.IService.Auth;
using LiveForum.IService.Others;
using LiveForum.Model.Dto.Auth;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
namespace LiveForum.WebApi.Controllers
{
/// <summary>
/// 登录注册相关接口
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AuthController : ControllerBase
{
private ILoginService _loginService;
private readonly IWechatMiniProgramService _wechatMiniProgramService;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="loginService">登录服务</param>
/// <param name="wechatMiniProgramService">微信小程序服务</param>
public AuthController(ILoginService loginService, IWechatMiniProgramService wechatMiniProgramService)
{
_loginService = loginService;
_wechatMiniProgramService = wechatMiniProgramService;
}
/// <summary>
/// 微信手机号登录(新版)
/// </summary>
[HttpPost]
public async Task<BaseResponse<JwtAccessToken>> WechatPhoneLogin(WechatPhoneLoginReq req)
{
if (req == null || string.IsNullOrEmpty(req.LoginCode) || string.IsNullOrEmpty(req.PhoneCode))
{
throw new ArgumentNullException("请求参数错误");
}
// 1. 用 loginCode 换取 openId
var loginInfo = await _wechatMiniProgramService.GetLoginInfoByCodeAsync(req.LoginCode);
if (!loginInfo.IsSuccessful)
{
throw new LoginErrorException($"登录失败,获取用户openId失败: {loginInfo.ErrorMessage}");
}
// 2. 用 phoneCode 获取手机号
var phoneNumber = await _wechatMiniProgramService.GetPhoneNumberByCodeAsync(req.PhoneCode);
if (string.IsNullOrEmpty(phoneNumber))
{
throw new LoginErrorException("获取手机号失败,请重试");
}
// 3. 执行手机号登录逻辑
var data = await _loginService.WechatPhoneLogin(loginInfo.OpenId, phoneNumber, loginInfo.SessionKey, loginInfo.UnionId);
return new BaseResponse<JwtAccessToken>(data);
}
/// <summary>
/// 微信小程序登录(旧版,保留兼容)
/// </summary>
/// <param name="wechatLogin"></param>
/// <returns></returns>
[HttpPost]
public async Task<BaseResponse<JwtAccessToken>> WechatMpLogin(WechatLoginReq wechatLogin)
{
if (wechatLogin == null || string.IsNullOrEmpty(wechatLogin.Code))
{
throw new ArgumentNullException("请求参数错误");
}
// 使用微信小程序服务获取登录信息
var loginInfo = await _wechatMiniProgramService.GetLoginInfoByCodeAsync(wechatLogin.Code);
if (!loginInfo.IsSuccessful)
{
throw new LoginErrorException($"登录失败,获取用户openId失败: {loginInfo.ErrorMessage}");
}
var data = await _loginService.WechatMpLogin(loginInfo.OpenId, loginInfo.SessionKey, loginInfo.UnionId);
return new BaseResponse<JwtAccessToken>(data);
}
/// <summary>
/// 刷新Token
/// </summary>
/// <returns></returns>
[Authorize]
[HttpPost]
public async Task<BaseResponse<JwtAccessToken>> RefreshToken()
{
var token = await _loginService.RefreshToken();
return new BaseResponse<JwtAccessToken>(token);
}
/// <summary>
/// 账号密码登录
/// </summary>
/// <param name="request">登录请求参数</param>
/// <returns></returns>
[HttpPost]
public async Task<BaseResponse<JwtAccessToken>> AccountLogin([FromBody] AccountLoginReq request)
{
if (request == null || string.IsNullOrEmpty(request.Account) || string.IsNullOrEmpty(request.Password))
{
throw new ArgumentNullException("请求参数错误");
}
var data = await _loginService.AccountLogin(request.Account, request.Password, request.AccountType);
return new BaseResponse<JwtAccessToken>("登录成功", data);
}
/// <summary>
/// 账号密码注册
/// </summary>
/// <param name="request">注册请求参数</param>
/// <returns></returns>
[HttpPost]
public async Task<BaseResponse<JwtAccessToken>> AccountRegister([FromBody] AccountRegisterReq request)
{
if (request == null || string.IsNullOrEmpty(request.LoginAccount) || string.IsNullOrEmpty(request.Password) || string.IsNullOrEmpty(request.NickName))
{
throw new ArgumentNullException("请求参数错误");
}
var data = await _loginService.AccountRegister(request.LoginAccount, request.AccountType, request.Password, request.NickName, request.VerifyCode);
return new BaseResponse<JwtAccessToken>("注册成功", data);
}
}
}