Files
Fishing2Server/Hotfix/Outer/Gate/System/JWT/GateJWTComponentSystem.cs
2025-07-16 17:47:53 +08:00

65 lines
2.2 KiB
C#

using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
using Fantasy.Entitas.Interface;
using Fantasy.Gate;
using Microsoft.IdentityModel.Tokens;
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
namespace System.Gate;
public sealed class GateJWTComponentAwakeSystem : AwakeSystem<GateJWTComponent>
{
protected override void Awake(GateJWTComponent self)
{
self.Awake();
}
}
public static class GateJWTComponentSystem
{
public static void Awake(this GateJWTComponent self)
{
var rsa = RSA.Create();
rsa.ImportRSAPublicKey(Convert.FromBase64String(self.PublicKeyPem), out _);
self.SigningCredentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256);
// 创建 TokenValidationParameters 对象,用于配置验证参数
self.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = false, // 禁止令牌验证时间是否过期
ValidateIssuer = true, // 验证发行者
ValidateAudience = true, // 验证受众
ValidateIssuerSigningKey = true, // 验证签名密钥
ValidIssuer = "Fantasy", // 有效的发行者
ValidAudience = "Fantasy", // 有效的受众
IssuerSigningKey = new RsaSecurityKey(rsa) // RSA公钥作为签名密钥
};
}
public static bool ValidateToken(this GateJWTComponent self, string token, out JwtPayload payload)
{
payload = null;
try
{
var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
jwtSecurityTokenHandler.ValidateToken(token, self.TokenValidationParameters, out _);
payload = jwtSecurityTokenHandler.ReadJwtToken(token).Payload;
return true;
}
catch (SecurityTokenInvalidAudienceException)
{
Console.WriteLine("验证受众失败!");
return false;
}
catch (SecurityTokenInvalidIssuerException)
{
Console.WriteLine("验证发行者失败!");
return false;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}