Ignore:
Timestamp:
08/09/22 16:09:32 (23 months ago)
Author:
Danilo <danilo.najkov@…>
Branches:
master
Children:
a569b7c
Parents:
899b19d
Message:

full auth flow

File:
1 edited

Legend:

Unmodified
Added
Removed
  • resTools_backend/backend/Services/UserService.cs

    r899b19d ra26f6a1  
    1 namespace backend.Services;
     1namespace backend.Services;
    22
    33using backend.Data;
    44using backend.DTOs;
     5using backend.Email;
    56using backend.Entities;
    67using backend.Helpers;
     
    1112using System.IdentityModel.Tokens.Jwt;
    1213using System.Security.Claims;
     14using System.Security.Cryptography;
     15using System.Text;
    1316
    1417public interface IUserService
     
    1720    Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst);
    1821    Task<User> GetById(int id);
     22    Task SendEmailConfirmation(string email);
     23    Task SendPasswordReset(string email);
     24    Task ConfirmEmail(User user, string checkValid);
     25    Task ResetPassword(string checkValid, string password);
    1926}
    2027
     
    2330    private readonly AppSettings _appSettings;
    2431    private readonly DataContext _context = null;
     32    private readonly IEmailSender _emailSender;
    2533
    26     public UserService(IOptions<AppSettings> appSettings, DataContext context)
     34    public UserService(IOptions<AppSettings> appSettings, DataContext context, IEmailSender emailSender)
    2735    {
    2836        _appSettings = appSettings.Value;
    2937        _context = context;
     38        _emailSender = emailSender;
    3039    }
    3140
     
    4049        var token = generateJwtToken(user);
    4150
    42         return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin};
     51        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed};
     52    }
     53
     54    public async Task ConfirmEmail(User user, string checkValid)
     55    {
     56        if(user.ConfirmationURL != checkValid)
     57        {
     58            throw new Exception("Invalid check");
     59        }
     60        if(user.ConfirmationValidTo < DateTime.UtcNow)
     61        {
     62            throw new Exception("Link expired");
     63        }
     64
     65        user.IsConfirmed = true;
     66        _context.Users.Update(user);
     67        await _context.SaveChangesAsync();
    4368    }
    4469
     
    5075    public async Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst)
    5176    {
    52         User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst };
     77        User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst, IsConfirmed = false };
    5378        await _context.Users.AddAsync(user);
    5479        await _context.SaveChangesAsync();
    5580        var token = generateJwtToken(user);
    56         return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin };
     81        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = false };
     82    }
     83
     84    public async Task ResetPassword(string checkValid, string password)
     85    {
     86        var user = await _context.Users.Where(x => x.PasswordResetURL == checkValid).FirstOrDefaultAsync();
     87        if (user == null)
     88        {
     89            throw new Exception("Invalid check");
     90        }
     91        if (user.PasswordResetValidTo < DateTime.UtcNow)
     92        {
     93            throw new Exception("Link expired");
     94        }
     95
     96        user.Password = password;
     97        _context.Users.Update(user);
     98        await _context.SaveChangesAsync();
     99    }
     100
     101    public async Task SendEmailConfirmation(string email)
     102    {
     103        User user = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
     104        user.ConfirmationURL = Guid.NewGuid().ToString();
     105        user.ConfirmationValidTo = DateTime.UtcNow.AddHours(24);
     106        _context.Users.Update(user);
     107        await _context.SaveChangesAsync();
     108        await _emailSender.SendEmailAsync(
     109            "Потврдете го вашиот емаил",
     110            "Ве молиме кликнете на следниот линк за да го потврдите вашиот емаил: http://localhost:3000/confirm?id=" + user.ConfirmationURL,
     111            email);
     112    }
     113
     114    public async Task SendPasswordReset(string email)
     115    {
     116        User user = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
     117        user.PasswordResetURL = Guid.NewGuid().ToString();
     118        user.PasswordResetValidTo = DateTime.UtcNow.AddHours(24);
     119        _context.Users.Update(user);
     120        await _context.SaveChangesAsync();
     121        await _emailSender.SendEmailAsync(
     122           "Ресетирајте ја лозинката",
     123           "Ве молиме кликнете на следниот линк за да ја ресетирате лозинката: http://localhost:3000/reset?id=" + user.PasswordResetURL,
     124           email);
    57125    }
    58126
     
    71139        return tokenHandler.WriteToken(token);
    72140    }
     141   
     142    private string sha256Hash(String value)
     143    {
     144        using (SHA256 hash = SHA256.Create())
     145        {
     146            return String.Concat(hash
     147              .ComputeHash(Encoding.UTF8.GetBytes(value))
     148              .Select(item => item.ToString("x2")));
     149        }
     150    }
    73151}
Note: See TracChangeset for help on using the changeset viewer.