/
Kovalenko
/
TODO
Обзор
Документация
Войти
/
Kovalenko
/
TODO
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
TaskApi/Controllers/AuthController.cs
102 строки
3 KB
Kovalenko1
Done
29 дек 2025, 11:50
29 дек 2025, 11:50
f453b3b
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using TaskApi.Data; using TaskApi.Dtos; using TaskApi.Models; using TaskApi.Services; namespace TaskApi.Controllers; [ApiController] [ApiExplorerSettings(GroupName = "v1")] [Route("api/v1/auth")] public class AuthController : ControllerBase { private readonly AppDbContext _db; private readonly PasswordHasher<User> _hasher; private readonly JwtTokenService _jwt; public AuthController(AppDbContext db, PasswordHasher<User> hasher, JwtTokenService jwt) { _db = db; _hasher = hasher; _jwt = jwt; } [HttpPost("register")] [AllowAnonymous] [ProducesResponseType(typeof(AuthResponse), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status409Conflict)] public async Task<ActionResult<AuthResponse>> Register([FromBody] AuthRequest request) { var email = ApiHelpers.NormalizeRequired(request.Email); if (email is null) { return BadRequest("Email is required."); } if (string.IsNullOrWhiteSpace(request.Password) || request.Password.Length < 6) { return BadRequest("Password must be at least 6 characters long."); } email = email.ToLowerInvariant(); if (await _db.Users.AnyAsync(user => user.Email == email)) { return Conflict("User already exists."); } var user = new User { Id = Guid.NewGuid(), Email = email, CreatedAt = DateTimeOffset.UtcNow }; user.PasswordHash = _hasher.HashPassword(user, request.Password); _db.Users.Add(user); await _db.SaveChangesAsync(); var token = _jwt.CreateToken(user); return Ok(new AuthResponse { Token = token, Email = user.Email }); } [HttpPost("login")] [AllowAnonymous] [ProducesResponseType(typeof(AuthResponse), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task<ActionResult<AuthResponse>> Login([FromBody] AuthRequest request) { var email = ApiHelpers.NormalizeRequired(request.Email); if (email is null) { return BadRequest("Email is required."); } if (string.IsNullOrWhiteSpace(request.Password)) { return BadRequest("Password is required."); } email = email.ToLowerInvariant(); var user = await _db.Users.FirstOrDefaultAsync(u => u.Email == email); if (user is null) { return Unauthorized(); } var verification = _hasher.VerifyHashedPassword(user, user.PasswordHash, request.Password); if (verification == PasswordVerificationResult.Failed) { return Unauthorized(); } var token = _jwt.CreateToken(user); return Ok(new AuthResponse { Token = token, Email = user.Email }); } }