/
ivanstrike
/
tasker
Обзор
Документация
Войти
/
ivanstrike
/
tasker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Controllers/AuthController.cs
129 строк
4 KB
ivanstrike
Init
20 окт 2025, 00:25
20 окт 2025, 00:25
db81298
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using TaskerApi.Data; using TaskerApi.DTOs; using TaskerApi.Models; using TaskerApi.Services; namespace TaskerApi.Controllers; /// <summary> /// Контроллер для аутентификации и регистрации пользователей /// </summary> [ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { private readonly ApplicationDbContext _context; private readonly IJwtService _jwtService; private readonly ILogger<AuthController> _logger; public AuthController( ApplicationDbContext context, IJwtService jwtService, ILogger<AuthController> logger) { _context = context; _jwtService = jwtService; _logger = logger; } /// <summary> /// Регистрация нового пользователя /// </summary> [HttpPost("register")] [ProducesResponseType(typeof(AuthResponseDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task<ActionResult<AuthResponseDto>> Register([FromBody] RegisterDto dto) { if (await _context.Users.AnyAsync(u => u.Username == dto.Username)) { return BadRequest(new { message = "Username already exists" }); } if (await _context.Users.AnyAsync(u => u.Email == dto.Email)) { return BadRequest(new { message = "Email already exists" }); } var user = new User { Username = dto.Username, Email = dto.Email, PasswordHash = BCrypt.Net.BCrypt.HashPassword(dto.Password), CreatedAt = DateTime.UtcNow }; _context.Users.Add(user); await _context.SaveChangesAsync(); var token = _jwtService.GenerateToken(user); var expiresAt = DateTime.UtcNow.AddMinutes(60); _logger.LogInformation("User registered successfully: {Username}", user.Username); return CreatedAtAction(nameof(Register), new AuthResponseDto { Token = token, Username = user.Username, ExpiresAt = expiresAt }); } /// <summary> /// Вход пользователя в систему /// </summary> [HttpPost("login")] [ProducesResponseType(typeof(AuthResponseDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task<ActionResult<AuthResponseDto>> Login([FromBody] LoginDto dto) { var user = await _context.Users .FirstOrDefaultAsync(u => u.Username == dto.Username); if (user == null || !BCrypt.Net.BCrypt.Verify(dto.Password, user.PasswordHash)) { _logger.LogWarning("Failed login attempt for username: {Username}", dto.Username); return Unauthorized(new { message = "Invalid username or password" }); } var token = _jwtService.GenerateToken(user); var expiresAt = DateTime.UtcNow.AddMinutes(60); _logger.LogInformation("User logged in successfully: {Username}", user.Username); return Ok(new AuthResponseDto { Token = token, Username = user.Username, ExpiresAt = expiresAt }); } /// <summary> /// Получение информации о текущем пользователе /// </summary> [HttpGet("me")] [Authorize] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task<ActionResult> GetCurrentUser() { var userId = Guid.Parse(User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value ?? "0"); var user = await _context.Users.FindAsync(userId); if (user == null) { return NotFound(); } return Ok(new { id = user.Id, username = user.Username, email = user.Email, createdAt = user.CreatedAt }); } }