summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs')
-rw-r--r--extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs42
1 files changed, 42 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs b/extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs
new file mode 100644

index 00000000..788c8eb9 --- /dev/null +++ b/extra/admin-api/Spacebar.AdminApi/Services/AuthenticationService.cs
@@ -0,0 +1,42 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Cryptography; +using Microsoft.IdentityModel.Tokens; +using Spacebar.Db.Contexts; +using Spacebar.Db.Models; + +namespace Spacebar.AdminApi.Services; + +public class AuthenticationService(SpacebarDbContext db, Configuration config) { + private static Dictionary<string, User> _userCache = new(); + private static Dictionary<string, DateTime> _userCacheExpiry = new(); + + public async Task<User> GetCurrentUser(HttpRequest request) { + if (!request.Headers.ContainsKey("Authorization")) { + Console.WriteLine(string.Join(", ", request.Headers.Keys)); + throw new UnauthorizedAccessException(); + } + + var token = request.Headers["Authorization"].ToString().Split(' ').Last(); + + var handler = new JwtSecurityTokenHandler(); + var secretFile = File.ReadAllText("../../../jwt.key.pub"); + var key = ECDsa.Create(ECCurve.NamedCurves.nistP256); + key.ImportFromPem(secretFile); + + var res = await handler.ValidateTokenAsync(token, new TokenValidationParameters { + IssuerSigningKey = new ECDsaSecurityKey(key), + ValidAlgorithms = ["ES512"], + LogValidationExceptions = true, + // These are required to be false for the token to be valid as they aren't provided by the token + ValidateIssuer = false, + ValidateLifetime = false, + ValidateAudience = false, + }); + + if (!res.IsValid && !config.DisableAuthentication) { + throw new UnauthorizedAccessException(); + } + + return await db.Users.FindAsync(config.OverrideUid ?? res.ClaimsIdentity.Claims.First(x => x.Type == "id").Value) ?? throw new InvalidOperationException(); + } +} \ No newline at end of file