public static JwtResult Decode(string token) { //var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGFpbTEiOjAsImNsYWltMiI6ImNsYWltMi12YWx1ZSJ9.8pwBI_HtXqI3UgQHQ_rDRnSQRxFL1SR8fbQoS-5kM5s"; //JwtResult jwtResult = new JwtResult() { Success = true }; JwtResult jwtResult = DependencyResolver.Current.GetService <JwtResult>(); if (string.IsNullOrWhiteSpace(token)) { jwtResult.Msg = "Token not provided"; return(jwtResult); } try { IJsonSerializer serializer = new CustomJsonSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); var json = decoder.DecodeToObject <IDictionary <string, dynamic> >(token, secret, verify: true); jwtResult.Result = json; jwtResult.Success = true; } catch (TokenExpiredException) { jwtResult.Msg = "Token has expired"; jwtResult.Timeout = true; } catch (SignatureVerificationException) { jwtResult.Msg = "Token has invalid signature"; } catch (Exception ex) { jwtResult.Msg = ex.Message; } return(jwtResult); }
public const string jti = "jti"; //jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 /// <summary> /// jwt的第三部分是一个签证信息,这个签证信息由三部分组成: /// 1、header (base64后的) /// 2、payload (base64后的) /// 3、signature (这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加secret组合加密,然后就构成了jwt的第三部分) /// 将这三部分用.连接成一个完整的字符串,构成了最终的jwt /// </summary> /// <param name="payload">载荷, 就是存放有效信息的地方</param> /// <param name="expire">过期时间, 单位:秒</param> /// <returns></returns> public static string Encode(Dictionary <string, object> payload, double expire = 24 * 60 * 60) { //var payload = new Dictionary<string, object> //{ // { "claim1", 0 }, // { "claim2", "claim2-value" } //}; if (expire != 0) { //添加过期时间 IDateTimeProvider provider = new UtcDateTimeProvider(); var now = provider.GetNow(); var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds) + expire; if (payload.ContainsKey(exp)) { payload[exp] = secondsSinceEpoch; } else { payload.Add(exp, secondsSinceEpoch); } } IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new CustomJsonSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); var token = encoder.Encode(payload, secret); return(token); }