/
AMachine
/
MMDB_Backend
Обзор
Документация
Войти
/
AMachine
/
MMDB_Backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
MMDB.WebApi/Controllers/AuthController.cs
91 строка
3 KB
AssaultMachine
микрорефакторинг
30 июн 2025, 14:55
30 июн 2025, 14:55
a5b5a81
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using MMDB.Core.Abstract.Infrastructure; using MMDB.Core.Abstract.Services; using MMDB.WebApi.Contracts; using MMDB.Core.Models; namespace MMDB.WebApi.Controllers; [Route("auth")] public class AuthController(ITokensService tokensService, IUsersService usersService, IPasswordHasher passwordHasher, IConfiguration configuration) : ControllerBase { [HttpPost("login")] public async Task<IResult> Login([FromBody] RefreshTokenRequest request) { var user = await usersService.GetByNameAsync(request.Username); if (user == null || !passwordHasher.PasswordVerify(request.Password, user.PasswordHash!)) return Results.Unauthorized(); if (!user.IsActive.Value) return Results.Unauthorized(); var refreshToken = await tokensService.GenerateRefreshTokenAsync(user); var accessToken = tokensService.GenerateAccessToken(user); HttpContext.Response.Cookies.Delete("token"); HttpContext.Response.Cookies.Append("token", refreshToken, new CookieOptions { HttpOnly = true, Path = "/", Expires = DateTime.UtcNow.AddDays(30) }); HttpContext.Response.Cookies.Append("access", accessToken, new CookieOptions { HttpOnly = false, Path = "/", Expires = DateTime.UtcNow.AddMinutes(10) }); return Results.Ok(); } [HttpPost("refresh")] public async Task<IResult> Refresh() { var refreshToken = HttpContext.Request.Cookies["token"]; if (!await tokensService.ValidateRefreshTokenAsync(refreshToken)) return Results.Unauthorized(); var userId = await tokensService.GetUserIdByRefreshTokenAsync(refreshToken); if (!(await usersService.GetByIdAsync(userId.Value)).IsActive.Value) return Results.Forbid(); if (!double.TryParse(configuration["JwtOptions:AccessExpiresInMinutes"], out var AccessTokenLifetime)) return Results.InternalServerError(); var accessToken = tokensService.GenerateAccessToken(await usersService.GetByIdAsync(userId.Value)); HttpContext.Response.Cookies.Append("access", accessToken, new CookieOptions { HttpOnly = true, Path = "/", Expires = DateTime.UtcNow.AddMinutes(AccessTokenLifetime) }); return Results.Ok(); } [HttpDelete("logout")] [Authorize] public IResult Logout() { HttpContext.Response.Cookies.Delete("token"); HttpContext.Response.Cookies.Delete("access"); return Results.Ok(); } [HttpPut] [Route("change_password")] [Authorize] public async Task<IResult> ChangeMyPassword([FromBody] ChangeMyPasswordRequest request) { var userId = await tokensService.GetUserIdByRefreshTokenAsync(HttpContext.Request.Cookies["token"]!); await usersService.UpdateAsync(userId!.Value, null, request.NewPassword, null, null, null); return Results.Ok(); } }