66 lines
2.6 KiB
C#
66 lines
2.6 KiB
C#
using System;
|
||
using Assets.Scripts.Entity;
|
||
using Fantasy.Helper;
|
||
using NBC;
|
||
|
||
namespace Assets.Scripts.Hotfix
|
||
{
|
||
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 = JsonHelper.Deserialize<Payload>(payload);
|
||
return true;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
Log.Error(e);
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
} |