private static void Encode(object Object, int?Indent, StringBuilder Json) { if (Object is null) { Json.Append("null"); } else { Type T = Object.GetType(); TypeInfo TI = T.GetTypeInfo(); if (TI.IsValueType) { if (Object is bool b) { Json.Append(CommonTypes.Encode(b)); } else if (Object is char ch) { Json.Append('"'); Json.Append(Encode(new string(ch, 1))); Json.Append('"'); } else if (Object is double dbl) { Json.Append(CommonTypes.Encode(dbl)); } else if (Object is float fl) { Json.Append(CommonTypes.Encode(fl)); } else if (Object is decimal dec) { Json.Append(CommonTypes.Encode(dec)); } else if (TI.IsEnum) { Json.Append('"'); Json.Append(Encode(Object.ToString())); Json.Append('"'); } else if (Object is DateTime TP) { Json.Append(((int)((TP.ToUniversalTime() - UnixEpoch).TotalSeconds)).ToString()); } else { Json.Append(Object.ToString()); } } else if (Object is string s) { Json.Append('"'); Json.Append(Encode(s)); Json.Append('"'); } else if (Object is IEnumerable <KeyValuePair <string, object> > Obj) { Encode(Obj, Indent, Json, null); } else if (Object is IEnumerable E) { IEnumerator e = E.GetEnumerator(); bool First = true; Json.Append('['); if (Indent.HasValue) { Indent = Indent + 1; } while (e.MoveNext()) { if (First) { First = false; } else { Json.Append(','); } if (Indent.HasValue) { Json.AppendLine(); Json.Append(new string('\t', Indent.Value)); } Encode(e.Current, Indent, Json); } if (!First && Indent.HasValue) { Json.AppendLine(); Indent = Indent - 1; Json.Append(new string('\t', Indent.Value)); } Json.Append(']'); } else { throw new ArgumentException("Unsupported type: " + T.FullName, nameof(Object)); } } }
/// <summary> /// Creates a new JWT token. /// </summary> /// <param name="Claims">Claims to include in token. /// /// For a list of public claim names, see: /// https://www.iana.org/assignments/jwt/jwt.xhtml</param> /// <returns>JWT token.</returns> public string Create(params KeyValuePair <string, object>[] Claims) { StringBuilder Json = new StringBuilder("{"); bool First = true; foreach (KeyValuePair <string, object> Claim in Claims) { if (First) { First = false; } else { Json.Append(','); } Json.Append('"'); Json.Append(JSON.Encode(Claim.Key)); Json.Append("\":"); if (Claim.Value == null) { Json.Append("null"); } else if (Claim.Value is string s) { Json.Append('"'); Json.Append(JSON.Encode(s)); Json.Append('"'); } else if (Claim.Value is bool b) { if (b) { Json.Append("true"); } else { Json.Append("false"); } } else if (Claim.Value is DateTime TP) { Json.Append(((int)((TP.ToUniversalTime() - JwtToken.epoch).TotalSeconds)).ToString()); } else if (Claim.Value is int i) { Json.Append(i.ToString()); } else if (Claim.Value is long l) { Json.Append(l.ToString()); } else if (Claim.Value is short sh) { Json.Append(sh.ToString()); } else if (Claim.Value is byte bt) { Json.Append(bt.ToString()); } else { Json.Append('"'); Json.Append(JSON.Encode(Claim.Value.ToString())); Json.Append('"'); } } Json.Append('}'); string PayloadStr = Json.ToString(); byte[] PayloadBin = Encoding.UTF8.GetBytes(PayloadStr); string Payload = JwtToken.Base64UrlEncode(PayloadBin); byte[] Signature; string Token = this.header + "." + Payload; lock (this.hmacSHA256) { Signature = this.hmacSHA256.ComputeHash(Encoding.ASCII.GetBytes(Token)); } Token += "." + JwtToken.Base64UrlEncode(Signature); return(Token); }
private static void Encode(object Object, int?Indent, StringBuilder Json) { if (Object is null) { Json.Append("null"); } else { Type T = Object.GetType(); TypeInfo TI = T.GetTypeInfo(); if (TI.IsValueType) { if (Object is bool b) { Json.Append(CommonTypes.Encode(b)); } else if (Object is char ch) { Json.Append('"'); Json.Append(Encode(new string(ch, 1))); Json.Append('"'); } else if (Object is double dbl) { Json.Append(CommonTypes.Encode(dbl)); } else if (Object is float fl) { Json.Append(CommonTypes.Encode(fl)); } else if (Object is decimal dec) { Json.Append(CommonTypes.Encode(dec)); } else if (TI.IsEnum) { Json.Append('"'); Json.Append(Encode(Object.ToString())); Json.Append('"'); } else if (Object is DateTime TP) { Json.Append(((int)((TP.ToUniversalTime() - UnixEpoch).TotalSeconds)).ToString()); } else { Json.Append(Object.ToString()); } } else if (Object is string s) { Json.Append('"'); Json.Append(Encode(s)); Json.Append('"'); } else if (Object is IEnumerable <KeyValuePair <string, object> > Obj) { Encode(Obj, Indent, Json, null); } else if (Object is IEnumerable <KeyValuePair <string, IElement> > Obj2) { Encode(Obj2, Indent, Json); } else if (Object is IEnumerable E) { IEnumerator e = E.GetEnumerator(); bool First = true; Json.Append('['); if (Indent.HasValue) { Indent++; } while (e.MoveNext()) { if (First) { First = false; } else { Json.Append(','); } if (Indent.HasValue) { Json.AppendLine(); Json.Append(new string('\t', Indent.Value)); } Encode(e.Current, Indent, Json); } if (!First && Indent.HasValue) { Json.AppendLine(); Indent--; Json.Append(new string('\t', Indent.Value)); } Json.Append(']'); } else if (Object is ObjectMatrix M && !(M.ColumnNames is null)) { bool First = true; Json.Append('['); if (Indent.HasValue) { Indent++; } foreach (IElement Element in M.VectorElements) { if (First) { First = false; Encode(M.ColumnNames, Indent, Json); } Json.Append(','); if (Indent.HasValue) { Json.AppendLine(); Json.Append(new string('\t', Indent.Value)); } Encode(Element.AssociatedObjectValue, Indent, Json); } if (!First && Indent.HasValue) { Json.AppendLine(); Indent--; Json.Append(new string('\t', Indent.Value)); } Json.Append(']'); }