using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Bunny.Common.Exception;
using Bunny.Dao.Model.Constant;
using Newtonsoft.Json;
namespace Bunny.Common.Utils.Jwt;
public static partial class JwtUtil
{
///
/// 返回所有的 jwt
///
/// token解析
public static JwtSecurityToken JwtParse(string token)
{
if (token == null) return null;
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.ReadJwtToken(token);
}
///
/// 返回发行者
///
/// token解析
public static string JwtParseIssuer(string jwt)
{
return JwtParse(jwt).Issuer;
}
///
/// 返回授权者
///
/// token解析
public static IEnumerable JwtParseAudiences(string jwt)
{
return JwtParse(jwt).Audiences;
}
///
/// 返回负载中内容
///
/// jwt 解析
public static IEnumerable JwtParseClaim(string jwt)
{
return JwtParse(jwt).Claims;
}
///
/// 将生成的JWT值转成字典格式
///
///
/// Dictionary
public static Dictionary ParseJwtToDictionary(string jwt)
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtSecurityToken = tokenHandler.ReadJwtToken(jwt);
// 初始化字典
var dictionary = new Dictionary();
var jClaims = jwtSecurityToken.Claims;
// 将得到的每一个值都放入字典中
foreach (var claim in jClaims) dictionary[claim.Type] = claim.Value;
// 返回字典
return dictionary;
}
///
/// 将生成的 JwtSecurityToken 值转成字典格式
///
///
/// Dictionary
public static Dictionary ParseJwtToDictionary(JwtSecurityToken jwtToken)
{
// 初始化字典
var dictionary = new Dictionary();
// 将得到的每一个值都放入字典中
foreach (var claim in jwtToken.Claims) dictionary[claim.Type] = claim.Value;
// 返回字典
return dictionary;
}
///
/// 将 jwt 转成 实体类
///
/// jwt
/// 实体类
public static T? ParseJwtToObject(string jwt)
{
if (jwt == null) throw new BunnyException(ExceptionConstant.TokenIsEmpty);
var dictionary = new Dictionary();
// 将 jwt 转成 Claim
var claims = JwtParseClaim(jwt);
// 找到对应的字典 Dictionary
foreach (var claim in claims) dictionary[claim.Type] = claim.Value;
// 返回实体类
var json = JsonConvert.SerializeObject(dictionary);
// 将JSON转为对象
return JsonConvert.DeserializeObject(json);
}
///
/// 将 JSON 转成 Dictionary
///
///
/// Dictionary
public static Dictionary ParseJsonToDictionary(string jsonString)
{
// 初始化字典
var dictionary = new Dictionary();
// 将JSON转成字典格式
var claims = ParseJsonToClaimEnumerable(jsonString);
// 将得到的每一个值都放入字典中
foreach (var claim in claims) dictionary[claim.Type] = claim.Value;
// 返回 Dictionary
return dictionary;
}
///
/// 将 JSON 转成 Claim
///
///
/// Claim
public static IEnumerable ParseJsonToClaimEnumerable(string jsonString)
{
// 将JSON转成字典格式
var deserializeWithDictionary = JsonConvert.DeserializeObject>(jsonString);
// 返回Claim
return deserializeWithDictionary!.Select(item =>
{
if (item.Value == null)
return new Claim(item.Key, string.Empty);
return new Claim(item.Key, item.Value.ToString()!);
})
.ToList();
}
///
/// 将 JSON 转成 实体类
///
/// JSON字符串
/// 实体类
public static T? ParseJsonToObject(string jsonString)
{
// 将JSON转成字典格式
var claims = ParseJsonToClaimEnumerable(jsonString);
// 初始化字典
var dictionary = new Dictionary();
// 将得到的每一个值都放入字典中
foreach (var claim in claims) dictionary[claim.Type] = claim.Value;
// 返回实体类
var json = JsonConvert.SerializeObject(dictionary);
// 将JSON转为对象
return JsonConvert.DeserializeObject(json);
}
///
/// 将 Claim 抓成 Dictionary
///
///
/// Dictionary
public static Dictionary ParseClaimToDictionary(IEnumerable claims)
{
// 初始化字典
var dictionary = new Dictionary();
// 将得到的每一个值都放入字典中
foreach (var claim in claims) dictionary[claim.Type] = claim.Value;
// 返回字典格式
return dictionary;
}
}