using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser; using GozareshgirProgramManager.Application.Modules.Users.Commands.RefreshUserToken; using GozareshgirProgramManager.Application.Modules.Users.Commands.SignOutUser; using GozareshgirProgramManager.Application.Modules.Users.Commands.SsoLogin; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; /// /// کنترلر احراز هویت /// public class AuthController : ProgramManagerBaseController { private readonly IAuthHelper _authHelper; private readonly IMediator _mediator; public AuthController(IAuthHelper authHelper, IMediator mediator) { _authHelper = authHelper; _mediator = mediator; } /// /// ورود به سیستم با شناسه کاربری /// /// شناسه کاربر /// فقط Access Token - Refresh Token در سرور ذخیره می‌شود [HttpPost("login")] [AllowAnonymous] public async Task>> Login([FromBody] LoginByIdRequest request) { var command = new LoginUserCommand(request.UserId); var result = await _mediator.Send(command); return result; } /// /// ورود به سیستم از طریق SSO با استفاده از توکن JWT /// توکن JWT از query string دریافت می‌شود و Claims آن استخراج می‌شود /// سپس کاربر بر اساس AccountId موجود در Claims لاگین می‌شود /// /// JWT Token از سیستم خارجی /// Access Token و اطلاعات کاربر [HttpGet("sso-login")] [AllowAnonymous] public async Task>> SsoLogin([FromQuery] string token) { if (string.IsNullOrWhiteSpace(token)) { return BadRequest(OperationResult.Failure("توکن الزامی است", ErrorType.BadRequest)); } var command = new SsoLoginCommand(token); var result = await _mediator.Send(command); return result; } /// /// خروج از سیستم /// [HttpPost("signout")] [Authorize] public new async Task> SignOut() { // دریافت Refresh Token از Header با استفاده از AuthHelper var refreshToken = _authHelper.GetRefreshTokenFromCookie(); if (string.IsNullOrEmpty(refreshToken)) { return OperationResult.Failure("توکن تازه‌سازی یافت نشد"); } var command = new SignOutUserCommand(refreshToken); var result = await _mediator.Send(command); if (result.IsSuccess) { return Ok(result); } return StatusCode(result.ErrorType switch { ErrorType.Unauthorized => 401, ErrorType.BadRequest => 400, ErrorType.NotFound => 404, _ => 500 }, result); } /// /// تازه‌سازی توکن دسترسی /// توکن منقضی شده را می‌گیرد و Access Token جدید برمی‌گرداند /// Refresh Token از دیتابیس خوانده می‌شود و به فرانت داده نمی‌شود /// [HttpPost("refresh")] [AllowAnonymous] public async Task> RefreshAccessToken() { var refreshTokenCommand = new RefreshUserTokenCommand(); var result = await _mediator.Send(refreshTokenCommand); return result; } /// /// دریافت اطلاعات کاربر جاری /// [HttpGet("current")] public IActionResult GetCurrentUser() { if (!_authHelper.IsAuthenticated()) { return Unauthorized(new { message = "کاربر احراز هویت نشده است" }); } return Ok(new { userId = _authHelper.GetCurrentUserId(), fullName= _authHelper.GetCurrentFullName(), roles = _authHelper.GetCurrentUserRoles() }); } } /// /// درخواست ورود با شناسه کاربری /// public class LoginByIdRequest { public long UserId { get; set; } }