diff --git a/qtc-net-server/Controllers/AuthController.cs b/qtc-net-server/Controllers/AuthController.cs index 859de3a..5d975ee 100644 --- a/qtc-net-server/Controllers/AuthController.cs +++ b/qtc-net-server/Controllers/AuthController.cs @@ -134,7 +134,6 @@ namespace qtc_api.Controllers } [HttpPost("request-password-reset")] - [Authorize] public async Task>> SendPasswordResetEmail(string email) { var user = await _userService.GetUserByEmail(email); diff --git a/qtc-net-server/Program.cs b/qtc-net-server/Program.cs index 10242b9..4420e19 100644 --- a/qtc-net-server/Program.cs +++ b/qtc-net-server/Program.cs @@ -28,7 +28,7 @@ builder.Services.AddControllers(); builder.Services.AddDbContext(); builder.Services.AddSignalR().AddHubOptions(options => { - options.EnableDetailedErrors = true; + options.EnableDetailedErrors = false; }); builder.Services.AddStackExchangeRedisCache(options => @@ -43,8 +43,6 @@ builder.Services.AddStackExchangeRedisCache(options => options.InstanceName = "QtCNetServer_"; }); -builder.Services.AddAuthentication().AddJwtBearer(); - builder.Services.AddTransient(); builder.Services.AddScoped(); @@ -55,6 +53,28 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(provider => GetServerConfig()); +builder.Services.AddAuthentication().AddJwtBearer(options => +{ + var jwtIssuer = builder.Configuration["Jwt:Issuer"]; + var jwtAudience = builder.Configuration["Jwt:Audience"]; + var jwtKey = builder.Configuration["Jwt:Key"] ?? Environment.GetEnvironmentVariable("JWT_KEY"); + + // check configuration for invalid jwt settings + if (jwtIssuer is null || jwtAudience is null || jwtKey is null) + throw new Exception("JWT Validation Parameters Are Not Set In appsettings.json. Please Set These Parameters."); + + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + ValidIssuer = jwtIssuer, + ValidAudience = jwtAudience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)) + }; +}); + ServerConfig GetServerConfig() { if (!File.Exists("./Resources/ServerConfig.json")) diff --git a/qtc-net-server/Resources/store.json b/qtc-net-server/Resources/store.json index 9b3aa2c..dfeb2ff 100644 --- a/qtc-net-server/Resources/store.json +++ b/qtc-net-server/Resources/store.json @@ -5,7 +5,7 @@ "Price": 100, "Name": "Example", "Description": "Change Me!", - "AssetUrl": "https://assets.alanmoon.net/qtc/cosmetics/test/test.gif", - "ThumbnailUrl": "https://assets.alanmoon.net/qtc/cosmetics/test/thumbnail.jpg" + "AssetUrl": "https://cdn.qtchat.net/qtc/cosmetics/test/test.gif", + "ThumbnailUrl": "https://cdn.qtchat.net/qtc/cosmetics/test/thumbnail.jpg" } ] diff --git a/qtc-net-server/Services/BucketService/BucketService.cs b/qtc-net-server/Services/BucketService/BucketService.cs index 2ac9315..f742987 100644 --- a/qtc-net-server/Services/BucketService/BucketService.cs +++ b/qtc-net-server/Services/BucketService/BucketService.cs @@ -13,7 +13,7 @@ namespace qtc_api.Services.BucketService public string CDNBucketName { get; private set; } = string.Empty; public string ImagesBucketName { get; private set; } = string.Empty; - private static AmazonS3Client S3Client = new(); + private static AmazonS3Client? S3Client; private IConfiguration _config; private ILogger _logger; diff --git a/qtc-net-server/Services/TokenService/TokenService.cs b/qtc-net-server/Services/TokenService/TokenService.cs index 4b93d8f..cc07299 100644 --- a/qtc-net-server/Services/TokenService/TokenService.cs +++ b/qtc-net-server/Services/TokenService/TokenService.cs @@ -70,6 +70,13 @@ namespace qtc_api.Services.TokenService _dataContext.ValidRefreshTokens.Add(refToken); + var existingToken = _dataContext.ValidRefreshTokens.FirstOrDefault(e => e.UserID == refToken.UserID); + if (existingToken != null) + { + refToken.Expires = existingToken.Expires; + _dataContext.ValidRefreshTokens.Remove(existingToken); // we don't want multiple refresh tokens assigned to the user + } + await _dataContext.SaveChangesAsync(); serviceResponse.Message = refToken.Token; @@ -260,15 +267,23 @@ namespace qtc_api.Services.TokenService { var serviceResponse = new ServiceResponse(); + var jwtIssuer = _configuration["Jwt:Issuer"]; + var jwtAudience = _configuration["Jwt:Audience"]; + var jwtKey = _configuration["Jwt:Key"] ?? Environment.GetEnvironmentVariable("JWT_KEY"); + + // check configuration for invalid jwt settings + if (jwtIssuer is null || jwtAudience is null || jwtKey is null) + throw new Exception("JWT Validation Parameters Are Not Set In appsettings.json. Please Set These Parameters."); + serviceResponse.Data = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, - ValidIssuer = _configuration["Jwt:Issuer"], - ValidAudience = _configuration["Jwt:Audience"], - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]!)) + ValidIssuer = jwtIssuer, + ValidAudience = jwtAudience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)) }; return serviceResponse;