作者 | 喵叔
责编 | 胡巍巍
出品 | 程序人生(ID:coder_life)
json
{
"alg":"HS256",
"typ":"JWT"
}
标准注册声明
公共声明:
私有声明:
json
{
"exp":"201909181230",
"role":"admin",
"isShow":false
}
HMACSHA256(base64UrlEncode(JWT 头) + "." + base64UrlEncode(有效载荷),密码)
base64UrlEncode(JWT 头)+"."+base64UrlEncode(有效载荷)+"."+HMACSHA256(base64UrlEncode(JWT 头) + "." + base64UrlEncode(有效载荷),密码)
定义 JWT 头
csharp
string jwtHeader = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
定义有效载荷
csharp
string exp = GetTimeStamp(DateTime.Now.AddHours(1));
string jwtHeader = "{\"name\":\"zhangsan\",\"exp\":\"" + exp + "\",\"jti\":\"123123\"}";
加密 JWT 头和有效载荷
生成哈希签名
string signature = HMACSHA256(jwtHeaderBase64Url + "." + jwtPlayloadBase64Url,"123123");
按顺序链接三部分,最终形成 JWT:
string jwtStr = jwtHeaderBase64Url + "." + jwtPlayloadBase64Url + "." + signature;
csharp
static void Main(string[] args)
{
string jwtHeader = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
string exp = GetTimeStamp(DateTime.Now.AddHours(1));
string jwtPlayload = "{\"name\":\"zhangsan\",\"exp\":\"" + exp + "\",\"jti\":\"123123\"}";
string jwtHeaderBase64Url = Base64Url(jwtHeader);
string jwtPlayloadBase64Url = Base64Url(jwtPlayload);
string signature = HMACSHA256(jwtHeaderBase64Url + "." + jwtPlayloadBase64Url,"123123");
string jwtStr = jwtHeaderBase64Url + "." + jwtPlayloadBase64Url + "." + signature;
Console.WriteLine(jwtStr);
Console.ReadLine();
}
private static string HMACSHA256(string message, string key)
{
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacSHA256 = new HMACSHA256(keyByte))
{
byte[] hashMessage = hmacSHA256.ComputeHash(messageBytes);
return BitConverter.ToString(hashMessage).Replace("-", "").ToLower();
}
}
private static string Base64Url(string str)
{
byte[] encodedBytes = Encoding.UTF8.GetBytes(str);
string base64EncodedText = Convert.ToBase64String(encodedBytes);
base64EncodedText = base64EncodedText
.Replace("=", String.Empty)
.Replace('+', '-')
.Replace('/', '_');
return base64EncodedText;
}
private static string GetTimeStamp(DateTime dt)
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
DateTime nowTime = dt;
long unixTime =
(long)System.Math.Round((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);
return unixTime.ToString();
}
static void Main(string[] args)
{
string exp = GetTimeStamp(DateTime.Now.AddHours(1));
var payload = new Dictionary<string, object>
{
{"name", "zhangsan"},
{"exp", exp},
{"jti", "123123"}
};
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
string jwtStr= encoder.Encode(payload, "123123");
Console.WriteLine(jwtStr);
Console.ReadLine();
}
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var json = decoder.Decode(jwtStr, "123123", verify: true);
前往“发现”-“看一看”浏览“朋友在看”