Files
Fishing2/Assets/Scripts/Common/Net/Hotfix/System/JWT/JWTParseComponentSystem.cs
2025-12-23 18:03:53 +08:00

69 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using Fantasy.Helper;
using NBC;
using Newtonsoft.Json;
namespace NBF
{
public static class JWTParseComponentSystem
{
//payload:{"aId":433552570364198912,"Address":"127.0.0.1:8080","exp":1729842327,"iss":"Fantasy","aud":"Fantasy"}
public static bool Parse(this JWTParseComponent self, string toKen, out Payload payloadData)
{
payloadData = null;
try
{
// JWT通常是由三个部分组成的,Header,Payload,Signature。
var tokens = toKen.Split('.');
if (tokens.Length != 3)
{
Log.Error("Invalid JWT token");
return false;
}
// JWT的Payload不是标准的Base64格式因为咱们C#的Convert要求是一个标准的Base64格式。
// JWT的Payload是Base64URL格式,它里面的"-"替代成了"+","_"替代成了"/",需要把这些给还原成Base64格式
var basePayload = tokens[1].Replace('-', '+').Replace('_', '/');
// 因为Base64的编码长度需要是4的倍数如果不是的话咱们需要把这个长度用=来填充,使其长度符合要求
switch (basePayload.Length % 4)
{
// case 0:
// {
// // 如果这个余数是0那就表示长度已经是4的倍数那就没必要处理了。
// break;
// }
// case 1:
// {
// // 如果这个余数是1那就表示这个Base64格式是不正确的不是咱们发放的token。
// // 这样情况下,也不需要处理了。
// break;
// }
case 2:
{
basePayload += "==";
break;
}
case 3:
{
basePayload += "=";
break;
}
}
// 将修复后的字符串解码为数组
var basePayloadBytes = Convert.FromBase64String(basePayload);
var payload = System.Text.Encoding.UTF8.GetString(basePayloadBytes);
payloadData =
JsonConvert.DeserializeObject<Payload>(payload); //JsonHelper.Deserialize<Payload>(payload);
return true;
}
catch (Exception e)
{
Log.Error(e);
return false;
}
}
}
}