aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/api/api/Controllers/AuthController.cs34
-rw-r--r--backend/api/api/Data/MongoDbSettings.cs17
-rw-r--r--backend/api/api/Models/JwtToken.cs37
-rw-r--r--backend/api/api/Models/PasswordCrypt.cs27
-rw-r--r--backend/api/api/Models/User.cs18
-rw-r--r--backend/api/api/Models/Users/AuthRequest.cs13
-rw-r--r--backend/api/api/Models/Users/RegisterRequest.cs23
-rw-r--r--backend/api/api/Services/AuthService.cs36
-rw-r--r--backend/api/api/Services/MongoDbService.cs11
-rw-r--r--backend/api/api/api.csproj11
-rw-r--r--backend/api/api/appsettings.json11
11 files changed, 235 insertions, 3 deletions
diff --git a/backend/api/api/Controllers/AuthController.cs b/backend/api/api/Controllers/AuthController.cs
new file mode 100644
index 00000000..1f47067f
--- /dev/null
+++ b/backend/api/api/Controllers/AuthController.cs
@@ -0,0 +1,34 @@
+using api.Models.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using api.Services;
+
+namespace api.Controllers
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class AuthController : ControllerBase
+ {
+ private AuthService _auth;
+ public AuthController(IConfiguration configuration)
+ {
+ _auth=new AuthService(configuration);
+ }
+
+ [HttpPost("register")]
+ public async Task<ActionResult<string>> Register(RegisterRequest user)
+ {
+
+ return Ok(_auth.Register(user));
+ }
+
+ [HttpPost("login")]
+ public async Task<ActionResult<string>> Login(AuthRequest user)
+ {
+
+ return Ok(_auth.Login(user));
+ }
+
+
+ }
+}
diff --git a/backend/api/api/Data/MongoDbSettings.cs b/backend/api/api/Data/MongoDbSettings.cs
new file mode 100644
index 00000000..8b42a02c
--- /dev/null
+++ b/backend/api/api/Data/MongoDbSettings.cs
@@ -0,0 +1,17 @@
+using Microsoft.EntityFrameworkCore;
+using MongoDB.Driver;
+
+namespace api.Data
+{
+ public class MongoDbSettings
+ {
+ public string? ConnectionURI { get; set; } = null;
+ public string? DatabaseName { get; set; } = null;
+ public string? CollectionName { get; set; } = null;
+
+
+
+
+
+ }
+}
diff --git a/backend/api/api/Models/JwtToken.cs b/backend/api/api/Models/JwtToken.cs
new file mode 100644
index 00000000..23307185
--- /dev/null
+++ b/backend/api/api/Models/JwtToken.cs
@@ -0,0 +1,37 @@
+using System.IdentityModel.Tokens.Jwt;
+using System.Security.Claims;
+using System.Text;
+using api.Models.Users;
+using Microsoft.IdentityModel.Tokens;
+
+namespace api.Models
+{
+ public class JwtToken
+ {
+ private readonly IConfiguration _configuration;
+
+ public JwtToken(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public string GenToken(AuthRequest user)
+ {
+ var tokenHandler = new JwtSecurityTokenHandler();
+ var key = Encoding.ASCII.GetBytes(_configuration.GetSection("AppSettings:JwtToken").Value);
+ var tokenDescriptor = new SecurityTokenDescriptor
+ {
+ Subject = new ClaimsIdentity(new[] { new Claim("name", user.UserName),
+ new Claim("role", "User")}),
+ Expires = DateTime.UtcNow.AddDays(1),
+ SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
+ };
+ var token = tokenHandler.CreateToken(tokenDescriptor);
+ return tokenHandler.WriteToken(token);
+
+ }
+
+
+
+ }
+}
diff --git a/backend/api/api/Models/PasswordCrypt.cs b/backend/api/api/Models/PasswordCrypt.cs
new file mode 100644
index 00000000..016fde51
--- /dev/null
+++ b/backend/api/api/Models/PasswordCrypt.cs
@@ -0,0 +1,27 @@
+namespace api.Models
+{
+ public class PasswordCrypt
+ {
+ private static int difficulty = 10;
+
+ public static String hashPassword(String password)
+ {
+ String salt = BCrypt.Net.BCrypt.GenerateSalt(difficulty);
+ String passwordHash = BCrypt.Net.BCrypt.HashPassword(password, salt);
+
+ return passwordHash;
+ }
+ public static Boolean checkPassword(String plainText,String hash)
+ {
+ Boolean verified = false;
+
+ if (hash == null || !hash.StartsWith("$2a$"))
+ throw new ArgumentException("invalid hash");
+
+ verified=BCrypt.Net.BCrypt.Verify(plainText, hash);
+
+ return verified;
+
+ }
+ }
+}
diff --git a/backend/api/api/Models/User.cs b/backend/api/api/Models/User.cs
new file mode 100644
index 00000000..d0f2bc0f
--- /dev/null
+++ b/backend/api/api/Models/User.cs
@@ -0,0 +1,18 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace api.Models
+{
+ public class User
+ {
+ [Key]
+ public Guid userId { get; set; }
+ public string username { get; set; }
+ public string email { get; set; }
+ public string password { get; set; }
+
+
+ public string firstName { get; set; }
+ public int lastName { get; set; }
+
+ }
+}
diff --git a/backend/api/api/Models/Users/AuthRequest.cs b/backend/api/api/Models/Users/AuthRequest.cs
new file mode 100644
index 00000000..fbf2412d
--- /dev/null
+++ b/backend/api/api/Models/Users/AuthRequest.cs
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace api.Models.Users
+{
+ public class AuthRequest
+ {
+ [Required]
+ public string UserName { get; set; }
+ [Required]
+ public string Password { get; set; }
+
+ }
+}
diff --git a/backend/api/api/Models/Users/RegisterRequest.cs b/backend/api/api/Models/Users/RegisterRequest.cs
new file mode 100644
index 00000000..675d571d
--- /dev/null
+++ b/backend/api/api/Models/Users/RegisterRequest.cs
@@ -0,0 +1,23 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace api.Models.Users
+{
+ public class RegisterRequest
+ {
+ [Required]
+ public string firstName { get; set; }
+
+ [Required]
+ public string lastName { get; set; }
+
+ [Required]
+ public string username { get; set; }
+
+ [Required]
+ public string email { get; set; }
+
+ [Required]
+ public string password { get; set; }
+
+ }
+}
diff --git a/backend/api/api/Services/AuthService.cs b/backend/api/api/Services/AuthService.cs
new file mode 100644
index 00000000..1a901cb8
--- /dev/null
+++ b/backend/api/api/Services/AuthService.cs
@@ -0,0 +1,36 @@
+using api.Models;
+using api.Models.Users;
+
+namespace api.Services
+{
+ public class AuthService
+ {
+ private JwtToken _jwt;
+ private readonly IConfiguration _configuration;
+ public AuthService(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ _jwt = new JwtToken(_configuration);
+ }
+ public string Login(AuthRequest user)
+ {
+ //Check username in DB
+
+ //Verify password
+
+ //gen token
+
+ return _jwt.GenToken(user);
+
+ }
+ public RegisterRequest Register(RegisterRequest user)
+ {
+ //check for existing email and username
+ user.password = PasswordCrypt.hashPassword(user.password);
+ //Add to DB. TO DO
+ return user;
+ }
+
+
+ }
+}
diff --git a/backend/api/api/Services/MongoDbService.cs b/backend/api/api/Services/MongoDbService.cs
new file mode 100644
index 00000000..f8b37536
--- /dev/null
+++ b/backend/api/api/Services/MongoDbService.cs
@@ -0,0 +1,11 @@
+
+
+
+namespace api.Services
+{
+ public class MongoDbService
+ {
+
+
+ }
+}
diff --git a/backend/api/api/api.csproj b/backend/api/api/api.csproj
index f278c90a..1451fa77 100644
--- a/backend/api/api/api.csproj
+++ b/backend/api/api/api.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
@@ -7,7 +7,14 @@
</PropertyGroup>
<ItemGroup>
- <Folder Include="Controllers\" />
+ <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
+ <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.16.0" />
+ <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.16.0" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.2" />
+ <PackageReference Include="MongoDB.Driver" Version="2.14.1" />
</ItemGroup>
</Project>
diff --git a/backend/api/api/appsettings.json b/backend/api/api/appsettings.json
index 10f68b8c..b9144d93 100644
--- a/backend/api/api/appsettings.json
+++ b/backend/api/api/appsettings.json
@@ -1,9 +1,18 @@
{
+ "AppSettings": {
+ "JwtToken": "2mnttqPtRb4GIWHFtagm"
+ },
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
- "AllowedHosts": "*"
+ "AllowedHosts": "*",
+ "MongoDb": {
+ "ConnectionURI": "mongodb+srv://LINKIKKKKKKK",
+ "DatabaseName": "",
+ "CollectionName": ""
+
+ }
}