Implementación de JWT para Harbour - (c) Matteo Baccan

Implementación de JWT para Harbour - (c) Matteo Baccan

Postby Baxajaun » Sun Mar 27, 2022 4:52 pm

Buenas tardes !!!

Una gran contribución de Matteo Baccan,

Implementación de JWT para Harbour

Una sencilla librería para trabajar con JSON Web Token y JSON Web Signature para el lenguaje Harbour. Puede encontrar más información sobre JWT en la página web https://jwt.io/.

Harbour JWT soporta los siguientes algoritmos:

HS256
HS384
HS512

https://github.com/matteobaccan/HarbourJwt

Muchas gracias Matteo !!!

Saludos,
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Implementación de JWT para Harbour - (c) Matteo Baccan

Postby karinha » Mon Mar 28, 2022 12:56 pm

Ejemplo de trabajo?

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7835
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Implementación de JWT para Harbour - (c) Matteo Baccan

Postby Baxajaun » Mon Mar 28, 2022 1:39 pm

Joao,

tienes un ejemplo en https://github.com/matteobaccan/HarbourJwt/blob/main/test/jwttest.prg

Code: Select all  Expand view  RUN
#include "hbclass.ch"
#include "hbhrb.ch"

FUNCTION Main
LOCAL handle := hb_hrbLoad( "../lib/jwt.hrb" )
LOCAL oJWT
LOCAL cToken
   
// Object
oJWT := &("JWT():new()")

// Header
oJWT:setAlgorithm("HS256")
oJWT:setType("JWT")

// Payload
oJWT:setSubject("1234567890")
oJWT:setPayloadData("name", "John Doe")
oJWT:setIssuedAt(1516239022)

// Secret
oJWT:setSecret("your-256-bit-secret")

cToken = oJWT:Encode()

// Default token denerated by https://jwt.io/
AssertEquals(cToken,"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c")

// Test HS384
oJWT:setAlgorithm("HS384")
oJWT:setSecret("your-384-bit-secret")
cToken = oJWT:Encode()
AssertEquals(cToken,"eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.8aMsJp4VGY_Ia2s9iWrS8jARCggx0FDRn2FehblXyvGYRrVVbu3LkKKqx_MEuDjQ")

// Test HS512
oJWT:setAlgorithm("HS512")
oJWT:setSecret("your-512-bit-secret")
cToken = oJWT:Encode()
AssertEquals(cToken,"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ._MRZSQUbU6G_jPvXIlFsWSU-PKT203EdcU388r5EWxSxg8QpB3AmEGSo2fBfMYsOaxvzos6ehRm4CYO1MrdwUg", oJWT:getError() )

// Token validation
AssertEquals( oJWT:Verify("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ._MRZSQUbU6G_jPvXIlFsWSU-PKT203EdcU388r5EWxSxg8QpB3AmEGSo2fBfMYsOaxvzos6ehRm4CYO1MrdwUg"), .T., oJWT:getError() )

oJWT:SetIssuer('Matteo')
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )
AssertEquals( oJWT:Decode(cToken), .T., oJWT:getError() )

// Verify is false because secret is reset by Decode
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )

// Recover secret
oJWT:setSecret("your-512-bit-secret")
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// test different odience
oJWT:SetSubject("new subject")
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetSubject("1234567890")
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// test different odience
oJWT:SetAudience("new odience")
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetAudience(NIL)
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// Expired token
oJWT:SetExpration( oJWT:GetSeconds()-1 )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetExpration( oJWT:GetSeconds()+1 )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// NotBefore
oJWT:SetNotBefore( oJWT:GetSeconds()+2 )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetNotBefore( oJWT:GetSeconds() )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// Issued at
oJWT:SetIssuedAt( oJWT:GetSeconds()+1 )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetIssuedAt( oJWT:GetSeconds() )
cToken = oJWT:Encode()
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// JWTId
oJWT:SetJWTId("ID:100")
AssertEquals( oJWT:Verify(cToken), .F., oJWT:getError() )
oJWT:SetJWTId(NIL)
AssertEquals( oJWT:Verify(cToken), .T., oJWT:getError() )

// Token decode
AssertEquals( oJWT:Decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik1hdHRlbyBCYWNjYW4iLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTUxNjIzOTAyMn0.0T90m9fq8aOuiNbycTJxCf7BiQLw9xWXxe58-zV4RpY"), .T., oJWT:getError() )

// Check internal data exposion
AssertEquals(oJWT:GetHeader()['alg'], oJWT:GetAlgorithm(), oJWT:getError() )
oJWT:GetHeader()['alg'] := 'dddd'
AssertEquals(oJWT:GetHeader()['alg'], oJWT:GetAlgorithm(), oJWT:getError() )

// Versione
AssertEquals(oJWT:GetVersion(), "1.0.2" )

hb_hrbUnload( handle )

RETU NIL


function AssertEquals( uValue, uExpected, cMessage )
   IF uValue==uExpected
      ? "OK - data verified"
   ELSE
      ? "KO - invalid data"
      ? "Value   :", uValue
      ? "Expected:", uExpected
      IF cMessage!=NIL .AND. !EMPTY(cMessage)
         ? cMessage
      ENDIF
   ENDIF
retu nil


Kind regards,
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Implementación de JWT para Harbour - (c) Matteo Baccan

Postby karinha » Mon Mar 28, 2022 2:47 pm

Muchas gracias. Su uso parece bastante sencillo.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7835
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 18 guests