Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Estoy registrando usuarios con este código y bueno lo que no funciona es las fechas con DateTime.Now y ademas me lo registra el usuario
- Desde el Id 2 cosa que no entiendo pero eso es menos importante.
- */
- AuthRepository.cs
- using JWTGymApi.Datos.Data.Repository.Interfaces;
- using JWTGymApi.Models;
- using Microsoft.EntityFrameworkCore;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace JWTGymApi.Datos.Data.Repository
- {
- public class AuthRepository : IAuthRepository
- {
- private readonly GymDbContext _context;
- public AuthRepository(GymDbContext context)
- {
- _context = context;
- }
- public async Task<User> Login(string email, string password)
- {
- var user = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
- if (user == null)
- return null;
- //quiero poner para verificar el hash pero bueno necesito tal vez un salt para el usuario
- //if (!VerifyPasswordHash(password, user.PasswordHash, user.PasswordSalt))
- return user;
- }
- private bool VerifyPasswordHash(string password, byte[] passwordhash, byte[] passwordSalt)
- {
- using (var hmac = new System.Security.Cryptography.HMACSHA512(passwordSalt))
- {
- var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
- for (int i = 0; i< computedHash.Length; i++)
- {
- if (computedHash[i] != passwordhash[i]) return false;
- }
- return true;
- }
- }
- public async Task<User> Register(User user, string password)
- {
- byte[] passwordHash;
- byte[] passwordSalt;
- DateTime CreateAt = DateTime.Now;
- DateTime UpdateAt = DateTime.Now;
- CreatePasswordHash(password, out passwordHash, out passwordSalt);
- user.PasswordHash = passwordHash;
- user.PasswordSalt = passwordSalt;
- //ponemos lo de las fechas
- user.CreationDateTime = CreateAt;
- user.LastUpdateDateTime = UpdateAt;
- await _context.Users.AddAsync(user);
- await _context.SaveChangesAsync();
- return user;
- }
- /// <summary>
- /// Create a password hash with own password.
- /// Crea un password hash con nuestro password.
- /// </summary>
- /// <param name="password"></param>
- /// <param name="passwordHash"></param>
- /// <param name="passwordSalt"></param>
- private void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt)
- {
- using (var hmac = new System.Security.Cryptography.HMACSHA512())
- {
- passwordSalt = hmac.Key;
- passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
- }
- }
- public async Task<bool> UserExist(string email)
- {
- if (await _context.Users.AnyAsync(x => x.Email == email))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- public Task<User> Register(UserDto user, string password)
- {
- throw new NotImplementedException();
- }
- }
- }
- AuthController.cs
- using AutoMapper;
- using JWTGymApi.Datos;
- using JWTGymApi.Datos.Data.Repository.Interfaces;
- using JWTGymApi.Datos.Data.Services.Interfaces;
- using JWTGymApi.Models;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- namespace JWTGymApi.Controllers
- {
- [Route("api/[controller]")]
- [ApiController]
- public class AuthController : ControllerBase
- {
- private readonly IAuthRepository _repo;
- private readonly ITokenService _tokenService;
- private readonly IMapper _mapper;
- private readonly GymDbContext _context;
- //Esto lo voy a hacer posteriormente el mapeo de las Dto que las pienso configurar
- //private readonly IMapper _mapper;
- //Las variables puestas en AuthController son para realizar la inyeccion de los servicios que necesitamos
- public AuthController(IAuthRepository repo, ITokenService tokenService, IMapper mapper, GymDbContext context)
- {
- _repo = repo;
- _tokenService = tokenService;
- _mapper = mapper;
- _context = context;
- }
- //la idea de los Dto es para este método según el curso tutorial de cacmis que estoy desarrollando, pero
- //a mi no me convence la verdad.
- [HttpPost("Register")]
- public async Task<IActionResult> Register(UserDto user)
- {
- //poner el email del usuario en minuscula
- user.Email = user.Email.ToLower();
- if (await _repo.UserExist(user.Email))
- return BadRequest("Usuario con ese email ya esta registrado");
- var userNew = _mapper.Map<User>(user);
- var userCreate = await _repo.Register(userNew, user.Password);
- var userReturn = _mapper.Map<User>(userCreate);
- return Ok(userReturn);
- }
- [HttpPost("Login")]
- public async Task<IActionResult> Login(UserLoginDto userLogin)
- {
- var userRepo = await _repo.Login(userLogin.Email, userLogin.Password);
- if (userRepo == null)
- return Unauthorized();
- var user = _mapper.Map<User>(userRepo);
- var token = _tokenService.CreateToken(userRepo);
- return Ok(new
- {
- token = token,
- user = userRepo
- });
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement