1
+ using AutoMapper ;
2
+ using Microsoft . AspNetCore . Authorization ;
3
+ using Microsoft . AspNetCore . Identity ;
4
+ using Microsoft . AspNetCore . Mvc ;
5
+ using Microsoft . CodeAnalysis . Options ;
6
+ using Microsoft . Extensions . Options ;
7
+ using Microsoft . IdentityModel . Tokens ;
8
+ using Supermarket . Entites . Models ;
9
+ using Supermarket . Extensions ;
10
+ using Supermarket . Identity . Models ;
11
+ using Supermarket . Resources ;
12
+ using System ;
13
+ using System . IdentityModel . Tokens . Jwt ;
14
+ using System . Linq ;
15
+ using System . Security . Claims ;
16
+ using System . Text ;
17
+ using System . Threading . Tasks ;
18
+
19
+ namespace Supermarket . Controllers
20
+ {
21
+ [ Route ( "api/[controller]" ) ]
22
+ [ ApiController ]
23
+ public class AccountController : ControllerBase
24
+ {
25
+ private readonly UserManager < ApplicationUser > _userManager ;
26
+ private readonly SignInManager < ApplicationUser > _signInManager ;
27
+ private readonly ApplicationSettings _appSettings ;
28
+ private readonly IMapper _mapper ;
29
+
30
+ public AccountController ( UserManager < ApplicationUser > userManager , SignInManager < ApplicationUser > signInManager ,
31
+ IOptions < ApplicationSettings > appSettings , IMapper mapper )
32
+ {
33
+ _userManager = userManager ;
34
+ _signInManager = signInManager ;
35
+ _appSettings = appSettings . Value ;
36
+ _mapper = mapper ;
37
+ }
38
+
39
+ [ HttpPost ]
40
+ [ Route ( "Register" ) ]
41
+ public async Task < IActionResult > Register ( [ FromBody ] RegisterResource resource )
42
+ {
43
+ if ( ! ModelState . IsValid )
44
+ return BadRequest ( ModelState . GetErrorMessage ( ) ) ;
45
+
46
+ var user = new ApplicationUser ( )
47
+ {
48
+ UserName = resource . Email ,
49
+ Email = resource . Email ,
50
+ FullName = resource . FullName
51
+ } ;
52
+
53
+ var result = await _userManager . CreateAsync ( user , resource . Password ) ;
54
+
55
+ return Ok ( result ) ;
56
+ }
57
+
58
+ [ HttpPost ]
59
+ [ Route ( "Login" ) ]
60
+ public async Task < IActionResult > Login ( [ FromBody ] LoginResource resource )
61
+ {
62
+ if ( ! ModelState . IsValid )
63
+ return BadRequest ( ModelState . GetErrorMessage ( ) ) ;
64
+
65
+ var user = await _userManager . FindByNameAsync ( resource . Email ) ;
66
+
67
+ if ( user != null && await _userManager . CheckPasswordAsync ( user , resource . Password ) )
68
+ {
69
+ var tokenDescriptor = new SecurityTokenDescriptor
70
+ {
71
+ Subject = new ClaimsIdentity ( new Claim [ ]
72
+ {
73
+ new Claim ( "UserId" , user . Id . ToString ( ) )
74
+ } ) ,
75
+ Expires = DateTime . UtcNow . AddDays ( 1 ) ,
76
+ SigningCredentials = new SigningCredentials (
77
+ new SymmetricSecurityKey ( Encoding . UTF8 . GetBytes ( _appSettings . JWT_Secret ) ) ,
78
+ SecurityAlgorithms . HmacSha256Signature )
79
+ } ;
80
+ var tokenHandler = new JwtSecurityTokenHandler ( ) ;
81
+ var securityToken = tokenHandler . CreateToken ( tokenDescriptor ) ;
82
+ var token = tokenHandler . WriteToken ( securityToken ) ;
83
+
84
+ return Ok ( new { token } ) ;
85
+ }
86
+ else
87
+ {
88
+ return BadRequest ( new { message = "Username or password is incorrect" } ) ;
89
+ }
90
+ }
91
+
92
+ [ HttpGet ]
93
+ [ Authorize ]
94
+ [ Route ( "Profile" ) ]
95
+ public async Task < IActionResult > GetUserInfo ( )
96
+ {
97
+ var userId = User . Claims . First ( c => c . Type == "UserId" ) . Value ;
98
+ var user = await _userManager . FindByIdAsync ( userId ) ;
99
+
100
+ var userProfileResource = _mapper . Map < ApplicationUser , UserProfileResource > ( user ) ;
101
+
102
+ return Ok ( userProfileResource ) ;
103
+ }
104
+ }
105
+ }
0 commit comments