Public Sub generateJWT(data As Map, secret As String, expires As Int) As String
Dim header As Map = CreateMap("alg": "HS256", "typ": "JWT")
Main.kvs.Put("TimeZoneOffset",DateTime.TimeZoneOffset)
Dim exp As Long = DateUtils.TicksToUnixTime(DateTime.Now) + expires
Dim payload As Map = CreateMap("sub": data, "exp": exp)
Dim JSON As JSONGenerator
JSON.Initialize(header)
Dim su As StringUtils
Dim tHeader As String = JSON.ToString
tHeader = su.EncodeBase64(tHeader.GetBytes("utf8"))
tHeader = tHeader.Replace("+", "-")
tHeader = tHeader.Replace("/", "_")
If tHeader.SubString(tHeader.Length-1) = "=" Then tHeader = tHeader.SubString2(0, tHeader.Length-1)
If tHeader.SubString(tHeader.Length-1) = "=" Then tHeader = tHeader.SubString2(0, tHeader.Length-1)
JSON.Initialize(payload)
Dim tPayload As String = JSON.ToString
tPayload = su.EncodeBase64(tPayload.GetBytes("utf8"))
tPayload = tPayload.Replace("+", "-")
tPayload = tPayload.Replace("/", "_")
If tPayload.SubString(tPayload.Length-1) = "=" Then tPayload = tPayload.SubString2(0, tPayload.Length-1)
If tPayload.SubString(tPayload.Length-1) = "=" Then tPayload = tPayload.SubString2(0, tPayload.Length-1)
Dim message As String = tHeader & "." & tPayload
Dim objResult() As Byte
#if b4a
Dim joMac As JavaObject
joMac = joMac.InitializeStatic("javax.crypto.Mac").RunMethod("getInstance", Array("HmacSHA256"))
Dim keySpec As JavaObject
keySpec.InitializeNewInstance("javax.crypto.spec.SecretKeySpec", Array(secret.GetBytes("UTF8"), "HmacSHA256"))
joMac.RunMethod("init", Array(keySpec))
Dim objResult() As Byte = joMac.RunMethod("doFinal", Array(message.GetBytes("UTF8")))
#End If
#If B4I
Dim no As NativeObject = Me
Dim res As Object = no.RunMethod("hmacForKeyAndData::", Array(no.ArrayToNSData(secret.GetBytes("UTF8")), no.ArrayToNSData(message.GetBytes("utf8"))))
objResult = no.NSDataToArray(res)
#End If
Dim tSignature As String = su.EncodeBase64(objResult)
tSignature = tSignature.Replace("+", "-")
tSignature = tSignature.Replace("/", "_")
If tSignature.SubString(tSignature.Length-1) = "=" Then tSignature = tSignature.SubString2(0, tSignature.Length-1)
If tSignature.SubString(tSignature.Length-1) = "=" Then tSignature = tSignature.SubString2(0, tSignature.Length-1)
Return (message & "." & tSignature)
End Sub
#if OBJC
#import <CommonCrypto/CommonHMAC.h>
- (NSData*) hmacForKeyAndData:(NSData*)cKey :(NSData*) cData
{
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, [cKey bytes], [cKey length], [cData bytes], [cData length], cHMAC);
return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
}
#End If
End Sub