104 lines
3.2 KiB
C#
104 lines
3.2 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.AspNetCore.Identity;
|
||
using Cloud.Models;
|
||
using Cloud.Requests;
|
||
using Microsoft.IdentityModel.Tokens;
|
||
using System.IdentityModel.Tokens.Jwt;
|
||
using System.Text;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using System.Security.Claims;
|
||
|
||
namespace Cloud.Controllers;
|
||
|
||
[ApiController]
|
||
[Route("api/[controller]")]
|
||
public class AuthController : ControllerBase
|
||
{
|
||
private PasswordHasher<User> _passwordHasher;
|
||
private IConfiguration _config;
|
||
private ApplicationContext _context;
|
||
|
||
public AuthController(IConfiguration config, ApplicationContext context)
|
||
{
|
||
_passwordHasher = new PasswordHasher<User>();
|
||
_config = config;
|
||
_context = context;
|
||
}
|
||
|
||
[HttpPost("register")]
|
||
public async Task<IActionResult> Register([FromBody] RegisterRequest request)
|
||
{
|
||
var existUser = await _context.Users.SingleOrDefaultAsync(u => u.Email == request.Email);
|
||
|
||
if (existUser != null) {
|
||
return BadRequest("Пользователь с такой эл. почтой уже существует");
|
||
}
|
||
|
||
var user = new User
|
||
{
|
||
Name = request.Name,
|
||
Email = request.Email,
|
||
Password = _passwordHasher.HashPassword(null, request.Password)
|
||
};
|
||
|
||
_context.Users.Add(user);
|
||
await _context.SaveChangesAsync();
|
||
|
||
return Ok("Пользователь успешно зарегистрирован");
|
||
}
|
||
|
||
[HttpPost("login")]
|
||
public async Task<IActionResult> Login([FromBody] LoginRequest request)
|
||
{
|
||
var user = await _context.Users.SingleOrDefaultAsync(u => u.Email == request.Email);
|
||
|
||
if (user == null) {
|
||
return Unauthorized("Пользователя с такой эл. почтой не существует");
|
||
}
|
||
|
||
var verificationResult = _passwordHasher.VerifyHashedPassword(null, user.Password, request.Password);
|
||
|
||
if (verificationResult == PasswordVerificationResult.Failed) {
|
||
return Unauthorized("Неверный пароль");
|
||
}
|
||
|
||
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
|
||
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
|
||
|
||
var claims = new[]
|
||
{
|
||
new Claim(ClaimTypes.Name, user.Email),
|
||
};
|
||
|
||
var Sectoken = new JwtSecurityToken(_config["Jwt:Issuer"],
|
||
_config["Jwt:Issuer"],
|
||
claims: claims,
|
||
expires: DateTime.Now.AddMinutes(120),
|
||
signingCredentials: credentials);
|
||
|
||
var token = new JwtSecurityTokenHandler().WriteToken(Sectoken);
|
||
|
||
return Ok(token);
|
||
}
|
||
|
||
[Authorize]
|
||
[HttpGet("user")]
|
||
public async Task<IActionResult> GetAuthUser()
|
||
{
|
||
var userEmail = User.Identity.Name;
|
||
|
||
var user = await _context.Users.SingleOrDefaultAsync(u => u.Email == userEmail);
|
||
|
||
if (user == null) {
|
||
return NotFound("Пользователь не найден");
|
||
}
|
||
|
||
return Ok(new
|
||
{
|
||
user.Id,
|
||
user.Name,
|
||
user.Email
|
||
});
|
||
}
|
||
} |