diff --git a/AMessanger.Application/ApplicationExtensions.cs b/AMessanger.Application/ApplicationExtensions.cs index 4ee1c2e..07f61fe 100644 --- a/AMessanger.Application/ApplicationExtensions.cs +++ b/AMessanger.Application/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using System.Text; +using AMessanger.Application.Settings; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +11,10 @@ public static class ApplicationExtensions { public static IServiceCollection AddAuth(this IServiceCollection services, IConfiguration configuration) { + var jwtConf = configuration.GetSection(JwtSettings.SECTION_NAME); + services.Configure(jwtConf); + var settings = jwtConf.Get()!; + services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { @@ -20,10 +25,10 @@ public static class ApplicationExtensions ValidateLifetime = true, ValidateIssuerSigningKey = true, - ValidIssuer = configuration["Jwt:Issuer"], - ValidAudience = configuration["Jwt:Audience"], + ValidIssuer = settings.Issuer, + ValidAudience = settings.Audience, IssuerSigningKey = new SymmetricSecurityKey( - Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!) + Encoding.UTF8.GetBytes(settings.Key) ) }; }); diff --git a/AMessanger.Application/Services/JwtService.cs b/AMessanger.Application/Services/JwtService.cs new file mode 100644 index 0000000..f32b582 --- /dev/null +++ b/AMessanger.Application/Services/JwtService.cs @@ -0,0 +1,38 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using AMessanger.Application.Settings; +using AMessanger.Core.Abstraction; +using AMessanger.Core.Models; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; + +namespace AMessanger.Application.Services; + +public class JwtService(IOptions options) : IJwtService +{ + private readonly JwtSettings _settings = options.Value; + + public string GenerateToken(User user) + { + var claims = new[] + { + new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), + new Claim(ClaimTypes.Name, user.Name) + }; + + var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.Key)); + + var creditnails = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + + var token = new JwtSecurityToken( + issuer: _settings.Issuer, + audience: _settings.Audience, + claims: claims, + expires: DateTime.UtcNow.AddMinutes(_settings.ExpiresMinutes), + signingCredentials: creditnails + ); + + return new JwtSecurityTokenHandler().WriteToken(token); + } +} \ No newline at end of file diff --git a/AMessanger.Application/Settings/JwtSettings.cs b/AMessanger.Application/Settings/JwtSettings.cs new file mode 100644 index 0000000..d2cf0ed --- /dev/null +++ b/AMessanger.Application/Settings/JwtSettings.cs @@ -0,0 +1,11 @@ +namespace AMessanger.Application.Settings; + +public class JwtSettings +{ + public const string SECTION_NAME = "Jwt"; + + public string Issuer { get; set; } = null!; + public string Audience { get; set; } = null!; + public int ExpiresMinutes { get; set; } + public string Key { get; set; } = null!; +} \ No newline at end of file diff --git a/AMessanger.Core/Abstraction/IJwtService.cs b/AMessanger.Core/Abstraction/IJwtService.cs new file mode 100644 index 0000000..8f252ca --- /dev/null +++ b/AMessanger.Core/Abstraction/IJwtService.cs @@ -0,0 +1,8 @@ +using AMessanger.Core.Models; + +namespace AMessanger.Core.Abstraction; + +public interface IJwtService +{ + public string GenerateToken(User user); +} \ No newline at end of file diff --git a/AMessanger.Core/Models/User.cs b/AMessanger.Core/Models/User.cs new file mode 100644 index 0000000..d0ea460 --- /dev/null +++ b/AMessanger.Core/Models/User.cs @@ -0,0 +1,8 @@ +namespace AMessanger.Core.Models; + +public class User(Guid id, string name, string hashedPassword) +{ + public Guid Id { get; private set; } = id; + public string Name { get; set; } = name; + public string HashedPassword { get; set; } = hashedPassword; +} \ No newline at end of file