/
egopen
/
Lab1
Обзор
Документация
Войти
/
egopen
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab4/library/Services/AuthService.cs
63 строки
2 KB
Egopen
lab 4
01 ноя 2025, 18:03
01 ноя 2025, 18:03
78d017c
Код
Авторство
О чём код?
using library.DB; using library.DB.Models; using library.Errors; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using Microsoft.Extensions.Caching.Memory; namespace library.Services { public class AuthService { LibraryDBContext _db; PasswordHasher<User> passwordHasher = new(); TokenService _tokenService; private readonly IMemoryCache _memoryCache; public AuthService(LibraryDBContext db, TokenService tokenService, IMemoryCache memoryCache) { _db = db; _tokenService = tokenService; _memoryCache = memoryCache; } public async Task<string?> RegisterUser(string name, string email, string password, string role) { var idempotencyKey = $"register_user_{email}_{name}"; if (_memoryCache.TryGetValue(idempotencyKey, out string cachedToken)) { return cachedToken; } if (_db.Users.Any(u => u.Email == email)) { return null; } Guid id = Guid.NewGuid(); User user = new User() {Id = id,Name = name, Email = email, Role = role }; string hash = passwordHasher.HashPassword(user, password); user.Password = hash; user.RefreshToken = _tokenService.CreateRefreshToken(id.ToString()); user.Id = id; _db.Users.Add(user); await _db.SaveChangesAsync(); var accessToken = _tokenService.CreateAccessToken(id.ToString(), role); _memoryCache.Set(idempotencyKey, accessToken, TimeSpan.FromMinutes(10)); return accessToken; } public async Task<string?> AuthUser(string email, string password) { var user = await _db.Users.FirstOrDefaultAsync(u => u.Email == email); if (user is null) { throw new NotFoundException("User not found"); } var refresh = _tokenService.CreateRefreshToken(user.Id.ToString()); user.RefreshToken = refresh; await _db.SaveChangesAsync(); return _tokenService.CreateAccessToken(user.Id.ToString(), user.Role); } } }