141 lines
5.3 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|