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); //JsonHelper.Deserialize(payload); return true; } catch (Exception e) { Log.Error(e); return false; } } } }