Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) Verify a JWT Created by the Amazon Cognito ServiceDemonstrates how to verify a JWT created by the Amazon Cognito Service.
IncludeFile "CkHttp.pb" IncludeFile "CkStringBuilder.pb" IncludeFile "CkJsonObject.pb" IncludeFile "CkPublicKey.pb" IncludeFile "CkJwt.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. ; The public keys for this example are at https://cognito-idp.us-east-2.amazonaws.com/us-east-2_******/.well-known/jwks.json ; Let's get them: http.i = CkHttp::ckCreate() If http.i = 0 Debug "Failed to create object." ProcedureReturn EndIf sbJsonKeys.i = CkStringBuilder::ckCreate() If sbJsonKeys.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success.i = CkHttp::ckQuickGetSb(http,"https://cognito-idp.us-east-2.amazonaws.com/us-east-2_******/.well-known/jwks.json",sbJsonKeys) If success = 0 Debug CkHttp::ckLastErrorText(http) CkHttp::ckDispose(http) CkStringBuilder::ckDispose(sbJsonKeys) ProcedureReturn EndIf jsonKeys.i = CkJsonObject::ckCreate() If jsonKeys.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkJsonObject::ckLoadSb(jsonKeys,sbJsonKeys) CkJsonObject::setCkEmitCompact(jsonKeys, 0) Debug CkJsonObject::ckEmit(jsonKeys) ; Here are the keys: ; { ; "keys": [ ; { ; "alg": "RS256", ; "e": "AQAB", ; "kid": "1A/L5Fsb2EsEwxy5E0cmCMS1BnMe6Jl6NXiMig4iNwU=", ; "kty": "RSA", ; "n": "y0w7BJrIJYi ... jKG27z2P3OKw", ; "use": "sig" ; }, ; { ; "alg": "RS256", ; "e": "AQAB", ; "kid": "mos6VTJnvDwurY3ghJg6IAPUq+dMwl6CL/iThzJOkzg=", ; "kty": "RSA", ; "n": "qbIEH-7tg6yrT ... 3Fj94ooTd0w", ; "use": "sig" ; } ; ] ; } ; Try the 1st key. jsonKey1.i = CkJsonObject::ckObjectOf(jsonKeys,"keys[0]") If CkJsonObject::ckLastMethodSuccess(jsonKeys) = 0 Debug "Did not get the 1st JSON public key." CkHttp::ckDispose(http) CkStringBuilder::ckDispose(sbJsonKeys) CkJsonObject::ckDispose(jsonKeys) ProcedureReturn EndIf pubKey1.i = CkPublicKey::ckCreate() If pubKey1.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success = CkPublicKey::ckLoadFromString(pubKey1,CkJsonObject::ckEmit(jsonKey1)) If success = 0 Debug CkPublicKey::ckLastErrorText(pubKey1) CkHttp::ckDispose(http) CkStringBuilder::ckDispose(sbJsonKeys) CkJsonObject::ckDispose(jsonKeys) CkPublicKey::ckDispose(pubKey1) ProcedureReturn EndIf CkJsonObject::ckDispose(jsonKey1) Debug "Success" jwt.i = CkJwt::ckCreate() If jwt.i = 0 Debug "Failed to create object." ProcedureReturn EndIf ; I did not include the an actual AWS Cognito token here because our test sample used customer-provided data.. token.s = "eyJ..asXg" ; First verify the signature. sigVerified.i = CkJwt::ckVerifyJwtPk(jwt,token,pubKey1) Debug "verified: " + Str(sigVerified) ; Let's see if the time constraints, if any, are valid. ; The above JWT was created on the afternoon of 16-May-2016, with an expiration of 1 hour. ; If the current system time is before the "nbf" time, or after the "exp" time, ; then IsTimeValid will return false/0. ; Also, we'll allow a leeway of 60 seconds to account for any clock skew. ; Note: If the token has no "nbf" or "exp" claim fields, then IsTimeValid is always true. leeway.i = 60 bTimeValid.i = CkJwt::ckIsTimeValid(jwt,token,leeway) Debug "time constraints valid: " + Str(bTimeValid) ; Now let's recover the original claims JSON (the payload). payload.s = CkJwt::ckGetPayload(jwt,token) ; The payload will likely be in compact form: Debug payload ; We can format for human viewing by loading it into Chilkat's JSON object ; and emit. json.i = CkJsonObject::ckCreate() If json.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success = CkJsonObject::ckLoad(json,payload) CkJsonObject::setCkEmitCompact(json, 0) Debug CkJsonObject::ckEmit(json) ; We can recover the original JOSE header in the same way: joseHeader.s = CkJwt::ckGetHeader(jwt,token) ; The payload will likely be in compact form: Debug joseHeader ; We can format for human viewing by loading it into Chilkat's JSON object ; and emit. success = CkJsonObject::ckLoad(json,joseHeader) CkJsonObject::setCkEmitCompact(json, 0) Debug CkJsonObject::ckEmit(json) CkHttp::ckDispose(http) CkStringBuilder::ckDispose(sbJsonKeys) CkJsonObject::ckDispose(jsonKeys) CkPublicKey::ckDispose(pubKey1) CkJwt::ckDispose(jwt) CkJsonObject::ckDispose(json) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.