diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2020-02-12 16:44:17 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2020-02-12 16:44:17 +0200 |
| commit | 18477c8dc7e7971f2cfb08d0e11ca483944f79f2 (patch) | |
| tree | 22a7c735184c5df6a84d2182d3ff9b2222cc53b5 /Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs | |
| parent | 48ceaabee98371376e606361f396a61c479ce031 (diff) | |
| download | Tango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.tar.gz Tango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.zip | |
Added project Tango.MachineService.Gateway
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs')
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs new file mode 100644 index 000000000..7aa4860ab --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/WebToken.cs @@ -0,0 +1,192 @@ +using JWT; +using JWT.Algorithms; +using JWT.Builder; +using JWT.Serializers; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Web.Security +{ + public class WebToken + { + public DateTime Issued { get; protected set; } + public DateTime? Expiration { get; protected set; } + public String AccessToken { get; protected set; } + public String RefreshToken { get; protected set; } + + public WebToken() + { + + } + + public static WebToken CreateNew(String secret, DateTime? expiration = null) + { + DateTime issued = DateTime.UtcNow; + + var builder = new JwtBuilder() + .WithAlgorithm(new HMACSHA256Algorithm()) + .WithSecret(secret) + .IssuedAt(issued); + + if (expiration != null) + { + builder = builder.ExpirationTime(expiration.Value); + } + + String refreshToken = Guid.NewGuid().ToString(); + + builder = builder.AddClaim("object", null); + builder = builder.AddClaim("refresh-token", refreshToken); + + return new WebToken() + { + AccessToken = builder.Build(), + RefreshToken = refreshToken, + Expiration = expiration, + Issued = issued, + }; + } + + public static void Validate(String secret, String token) + { + var json = new JwtBuilder() + .WithSecret(secret) + .MustVerifySignature() + .Decode(token); + } + + public void Validate(String secret) + { + var json = new JwtBuilder() + .WithSecret(secret) + .MustVerifySignature() + .Decode(AccessToken); + } + + public WebToken Renew(String secret) + { + var newToken = CreateNew(secret, DateTime.UtcNow.Add(Expiration.Value - Issued)); + newToken.RefreshToken = RefreshToken; + return newToken; + } + + public static WebToken FromToken(String token) + { + WebToken webToken = new WebToken(); + + var payload = new JwtBuilder() + .WithValidator(null) + .Decode<IDictionary<string, object>>(token); + + webToken.AccessToken = token; + + if (payload.ContainsKey("exp")) + { + long exp = long.Parse(payload["exp"].ToString()); + webToken.Expiration = ConvertEpochToDateTime(exp); + } + + if (payload.ContainsKey("iat")) + { + long iat = long.Parse(payload["iat"].ToString()); + webToken.Issued = ConvertEpochToDateTime(iat); + } + + if (payload.ContainsKey("refresh-token")) + { + webToken.RefreshToken = payload["refresh-token"].ToString(); + } + + return webToken; + } + + protected static DateTime ConvertEpochToDateTime(long seconds) + { + var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return epoch.AddSeconds(seconds); + } + } + + public class WebToken<T> : WebToken where T : class + { + public T Object { get; protected set; } + + private WebToken() + { + + } + + public static WebToken<T> CreateNew(String secret, T obj = null, DateTime? expiration = null) + { + DateTime issued = DateTime.UtcNow; + + var builder = new JwtBuilder() + .WithAlgorithm(new HMACSHA256Algorithm()) + .WithSecret(secret) + .IssuedAt(issued); + + if (expiration != null) + { + builder = builder.ExpirationTime(expiration.Value); + } + + String refreshToken = Guid.NewGuid().ToString(); + + builder = builder.AddClaim("object", obj); + builder = builder.AddClaim("refresh-token", refreshToken); + + return new WebToken<T>() + { + AccessToken = builder.Build(), + RefreshToken = refreshToken, + Expiration = expiration, + Issued = issued, + Object = obj, + }; + } + + public static new WebToken<T> FromToken(String token) + { + WebToken<T> webToken = new WebToken<T>(); + + var payload = new JwtBuilder() + .WithValidator(null) + .Decode<IDictionary<string, object>>(token); + + webToken.AccessToken = token; + + if (payload.ContainsKey("exp")) + { + long exp = long.Parse(payload["exp"].ToString()); + webToken.Expiration = ConvertEpochToDateTime(exp); + } + + if (payload.ContainsKey("iat")) + { + long iat = long.Parse(payload["iat"].ToString()); + webToken.Issued = ConvertEpochToDateTime(iat); + } + + if (payload.ContainsKey("refresh-token")) + { + webToken.RefreshToken = payload["refresh-token"].ToString(); + } + + webToken.Object = JsonConvert.DeserializeObject<T>(payload["object"].ToString()); + + return webToken; + } + + public new WebToken<T> Renew(String secret) + { + var newToken = WebToken<T>.CreateNew(secret, Object, DateTime.UtcNow.Add(Expiration.Value - Issued)); + newToken.RefreshToken = RefreshToken; + return newToken; + } + } +} |
