mirror of
https://github.com/TbT480jcspy/Deluxe-2023-Server-Code.git
synced 2026-09-08 14:41:26 -07:00
98 lines
2.7 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|