Files
Deluxe-2023-Server-Code/Security/jwt.cs
T
Exception 1f113298e0 Movement
2026-05-09 14:31:53 -04:00

98 lines
2.7 KiB
C#

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
namespace DeluxeNET.Security
{
public class jwt
{
private readonly string _key = "CHANGE ME!";
public string GenerateToken(string userId)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(_key);
var roles = new List<string>
{
"gameClient",
"moderator",
"screenshare",
"keepsake",
"developer"
};
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, userId)
};
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256Signature
)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
public long? VerifyToken(string token)
{
if (string.IsNullOrEmpty(token)) return null;
token = token.Trim();
if (token.StartsWith("Bearer "))
token = token.Substring("Bearer ".Length).Trim();
try
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(_key);
var validationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ClockSkew = TimeSpan.Zero
};
ClaimsPrincipal principal = tokenHandler.ValidateToken(
token, validationParameters, out SecurityToken validatedToken
);
var subClaim = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (long.TryParse(subClaim, out long playerId)) return playerId;
return null;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
return null;
}
}
}
}