Advertisement
nobody01

auth_service

Nov 20th, 2018
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.93 KB | None | 0 0
  1. using Microsoft.AspNetCore.Identity;
  2. using MyDrive.Application.Mappers;
  3. using MyDrive.Common;
  4. using MyDrive.Common.Enums;
  5. using MyDrive.Contracts.Email;
  6. using MyDrive.Contracts.Models.Auth;
  7. using MyDrive.Contracts.Services;
  8. using MyDrive.Model;
  9. using System.Collections.Generic;
  10. using System.Text.Encodings.Web;
  11. using System.Threading.Tasks;
  12.  
  13. namespace MyDrive.Application.Services
  14. {
  15.     public class AuthService
  16.     {
  17.         private readonly UserManager<User> userManager;
  18.         private readonly UserService userService;
  19.         private readonly IEmailService emailService;
  20.         private readonly TokenProvider tokenProvider;
  21.  
  22.         public AuthService(UserManager<User> userManager, UserService userService,  IEmailService emailService, TokenProvider tokenProvider)
  23.         {
  24.             this.userManager = userManager;
  25.             this.userService = userService;
  26.             this.emailService = emailService;
  27.             this.tokenProvider = tokenProvider;
  28.         }
  29.  
  30.         public async Task<Result> RegisterAsync(RegisterModel model)
  31.         {
  32.             var validationErrors = await ValidateRegisterModel(model);
  33.  
  34.             if (validationErrors.Count > 0)
  35.             {
  36.                 return new Result(new Error(ErrorName.NotValid, validationErrors));
  37.             }
  38.  
  39.             var user = new User
  40.             {
  41.                 UserName = model.UserName,
  42.                 Email = model.Email,
  43.             };
  44.            
  45.             // Result from Identity
  46.             var creationResult = await userManager.CreateAsync(user, model.Password);
  47.  
  48.             if (!creationResult.Succeeded)
  49.             {
  50.                 return new Result(new Error(ErrorName.NotSpecified, "Rejestracja nie powiodła się z nieznanych przyczyn."));
  51.             }
  52.  
  53.             var emailResult = await SendEmailConfirmationTokenAsync(user);
  54.  
  55.             if (!emailResult.Successful)
  56.             {
  57.                 return new Result(new Error(ErrorName.NotSpecified, emailResult.ErrorDescription));
  58.             }
  59.  
  60.             return Result.SuccessfulResult;
  61.         }
  62.  
  63.         public async Task<Result<CurrentUserModel>> ConfirmEmailAsync(string userName, string token)
  64.         {
  65.             var user = await userManager.FindByNameAsync(userName);
  66.  
  67.             if (user == null)
  68.             {
  69.                 return new Result<CurrentUserModel>(new Error(ErrorName.NotValid, "Użytkownik o podanej nazwie nie istnieje."));
  70.             }
  71.  
  72.             // Result from Identity
  73.             var confirmationResult = await userManager.ConfirmEmailAsync(user, token);
  74.  
  75.             if (!confirmationResult.Succeeded)
  76.             {
  77.                 return new Result<CurrentUserModel>(new Error(ErrorName.NotSpecified, "Potwierdzenie adresu email nie powiodło się."));
  78.             }
  79.  
  80.             return new Result<CurrentUserModel>(UserMapper.CurrentUserModel(user, tokenProvider.GenerateJwtToken(user)));
  81.         }
  82.  
  83.         public async Task<Result<CurrentUserModel>> LoginAsync(LoginModel model)
  84.         {
  85.             var user = await userManager.FindByNameAsync(model.UserName);
  86.            
  87.             if (user == null)
  88.             {
  89.                 return new Result<CurrentUserModel>(new Error(ErrorName.NotAuthorized, "Użytkownik o podanej nazwie nie istnieje."));
  90.             }
  91.            
  92.             if (!await userManager.IsEmailConfirmedAsync(user))
  93.             {
  94.                 return new Result<CurrentUserModel>(new Error(ErrorName.NotAuthorized, "Adres email nie został potwierdzony."));
  95.             }
  96.  
  97.             if (!await userManager.CheckPasswordAsync(user, model.Password))
  98.             {
  99.                 return new Result<CurrentUserModel>(new Error(ErrorName.NotAuthorized, "Wprowadzone hasło nie jest prawidłowe."));
  100.             }
  101.  
  102.             return new Result<CurrentUserModel>(UserMapper.CurrentUserModel(user, tokenProvider.GenerateJwtToken(user)));
  103.         }
  104.  
  105.         public async Task<Result> SendPasswordResetTokenAsync(string email)
  106.         {
  107.             var user = await userManager.FindByEmailAsync(email);
  108.  
  109.             if (user == null)
  110.             {
  111.                 return new Result(new Error(ErrorName.NotValid, "Użytkownik o podanym adresie email nie istnieje."));
  112.             }
  113.  
  114.             var token = await userManager.GeneratePasswordResetTokenAsync(user);
  115.  
  116.             var message = new EmailMessage(user.UserName, user.Email)
  117.             {
  118.                 Subject = "Resetowanie hasła w MyDrive",
  119.                 Content = $"Twój kod pozwalający zresetować hasło to {token}"
  120.             };
  121.  
  122.             var emailResult = await emailService.SendAsync(message);
  123.  
  124.             if (!emailResult.Successful)
  125.             {
  126.                 return new Result(new Error(ErrorName.NotSpecified, emailResult.ErrorDescription));
  127.             }
  128.  
  129.             return Result.SuccessfulResult;
  130.         }
  131.  
  132.         public async Task<Result> ResetPasswordAsync(ResetPasswordModel model)
  133.         {
  134.             var user = await userManager.FindByNameAsync(model.UserName);
  135.  
  136.             if (user == null)
  137.             {
  138.                 return new Result(new Error(ErrorName.NotValid, "Użytkownik o podanej nazwie nie istnieje."));
  139.             }
  140.  
  141.             // Result from Identity
  142.             var resettingResult = await userManager.ResetPasswordAsync(user, model.Token, model.NewPassword);
  143.  
  144.             if (!resettingResult.Succeeded)
  145.             {
  146.                 return new Result(new Error(ErrorName.NotSpecified, "Nie udało się zresetować hasła."));
  147.             }
  148.  
  149.             return Result.SuccessfulResult;
  150.         }
  151.  
  152.         private async Task<IDictionary<string, string>> ValidateRegisterModel(RegisterModel model)
  153.         {
  154.             var isUserNameAvailableTask = userService.IsUserNameAvailableAsync(model.UserName);
  155.             var isEmailAvailableTask = userService.IsEmailAvailableAsync(model.Email);
  156.  
  157.             var isUserNameAvailable = await isUserNameAvailableTask;
  158.             var isEmailAvailable = await isEmailAvailableTask;
  159.  
  160.             var errors = new Dictionary<string, string>();
  161.  
  162.             if (!isEmailAvailable)
  163.             {
  164.                 errors[nameof(model.UserName)] = "Użytkownik o podanej nazwie już istnieje.";
  165.             }
  166.  
  167.             if (!isEmailAvailable)
  168.             {
  169.                 errors[nameof(model.Email)] = "Użytkownik o podanym adresie email już istnieje.";
  170.             }
  171.  
  172.             return errors;
  173.         }
  174.  
  175.         private async Task<EmailResult> SendEmailConfirmationTokenAsync(User user)
  176.         {
  177.             var token = await userManager.GenerateEmailConfirmationTokenAsync(user);
  178.  
  179.             var message = new EmailMessage(user.UserName, user.Email)
  180.             {
  181.                 Subject = "Potwierdzenie adresu email w MyDrive",
  182.                 Content = $"Twój kod potwierdzający to {UrlEncoder.Default.Encode(token)}"
  183.             };
  184.  
  185.             return await emailService.SendAsync(message);
  186.         }
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement