anonymous Log in
Search
Recents:
v3.0
gx-l
JWT não gera assinatura correta.
03/03/21 17:36

luismiyashita

Replies: 6

Boa tarde.
Tenho este código GX
&PrivateClaims.SetClaim("sub","1234567890")
&PrivateClaims.SetClaim("name","John Doe")
&PrivateClaims.SetClaim("iat","1516239022")
&KeyForm = 'C4EBDFB24A081E17029C8A919605A3C72950DA2489B463AC232BC828AD7934DD'
&JwtOptions.SetSecret(&KeyForm)
&Assinatura = &JwtCreator.DoCreate(JWTAlgorithm.HS256,&PrivateClaims,&JwtOptions)
Este são os dados gerados.
header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"1234567890","name":"John Doe","iat":"1516239022"}
Assinatura: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoiMTUxNjIzOTAyMiJ9.m871iPW-NkmNAV74G6KefftKonb1df00frV3m3FfRBc
Utilizo as mesmas informações no site JSON Web Tokens - jwt.io<https://jwt.io/>, a assinatura não confere
Assinatura gerada pelo site.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoiMTUxNjIzOTAyMiJ9.C1slqlMgmPCiHCSAwrPzVK2mOuLlSVglW9Y19rScsoc
A conversão do base64 estão corretas.
O problema esta na geração da assinatura.
O que há de errado no meu código??
Porque não posso utilizar qualquer valor na KEY (Ej. Minhakeyparaassinarjwt)
Atenciosamente
Luis Miyashita
-----------------------------------------
Para Suscribirse/Desuscribirse:
http://www.gxtechnical.com/cgi-bin/hforum.exe?2,3,30,1
Por consultas owner-gx-l@gxtech.com.uy
Replies

gtorrezani

03/03/21 19:59
Luis, Faltou converter sua chave para hexa antes do set &KeyForm = &HexaEncoder.ToHexa(&KeyForm) Att Gustavo Matias

leandro79337933

04/03/21 17:46
Hola Luis, "iat" es un claim reservado, y como indica la documentacion ( https://auth0.com/docs/tokens/json-web-tokens/json-web-token-claims#private-claims), "no deberia" pisarse con los reservados o publicos. Pero dice "no deberia"... no quiere decir que no se pueda... Probando tu código con GX17u2 y generador Java, el token si lo genera pero el "DoCreate" me da un error: Code: JW005 Description: The claim 'iat' contained a non-numeric date value. En mi opinion, el "iat" debería codificarse en GX asi: &JWTOptions.AddRegisteredClaim(RegisteredClaim.iat, "2021/03/04 17:35:20") Slds On Wed, Mar 3, 2021 at 5:36 PM Luis Miyashita

luismiyashita

04/03/21 22:36
Hola Leandro. Muchas Gracias por tus comentários. El problema es que no esta documentado al la wiki que tiene que cambiar la chave para Hexa. Iat: Estoy enviando el unix time-stamp, igual a el site https://jwt.io/ Y em C# no ocorre el error. Un saludo. Luis Miyashita

pmazzilli

05/03/21 09:25
Hola Luis, El tipo esperado se menciona en la documentación del SetSecret: https://wiki.genexus.com/commwiki/servlet/wiki?43983,JWT+Optional+Data#SetSecret A veces puede no ser intuitivo determinar si el valor ya está con el formato esperado, este doc puede ayudar: https://wiki.genexus.com/commwiki/servlet/wiki?46572,About+key%2C+IV%2C+and+nonce+encoding saludos On Thu, Mar 4, 2021 at 10:37 PM Luis Miyashita

luismiyashita

05/03/21 14:29
Hola Pablo. Ya consegui resolver el problema. El la wiki, la key tiene que ser hexadecimal, entonces cree uma key hexa &Key = 'C4EBDFB24A081E17029C8A919605A3C72950DA2489B463AC232BC828AD7934DD' &JwtOptions.SetSecret(&Key) Cuando el correcto es &Key = 'C4EBDFB24A081E17029C8A919605A3C72950DA2489B463AC232BC828AD7934DD' &KeyForm = &HexaEncoder.ToHexa(&KeyForm) &JwtOptions.SetSecret(&Key) Un duda. Si tengo un payload demasiado grande, tengo que añadir variable por variable?? No tiene algo como &PrivateClaims.FromJson(&SDT.ToJson) o &PrivateClaims.RAWText = &JsonTXT { "UngCod": 0, "CtaNum": "", "CtaMovDigCta": "", "CtaMovNumPor": "", "Caminho": "", "EncSobTrnTxt": "", "Simbolo": "", "EncSobTrn": "", "CtaBolDtaVct": 0, "CtaBolLinDig": "", "CtaBolDtaVctAux": "0000-00-00", "CtaBolVlr": "", "CtaBolDtaDoc": "0000-00-00", "CtaBolNroDoc": "", "CtaBolEspDoc": "", "CtaBolAce": "", "CtaBolUsoBco": "", "CtaBolCodCrt": "", "CtaBolMoe": "", "CtaBolCipBco": "", "CtaBolCed": "", "CtaBolNosNum": "", "CtaBolCodBar": "", "CtaBolCodBco": 0, "CtaBolAgeBco": 0, "CtaBolCcoBco": 0, "EmpNom": "", "CADBcoBltCedEnd": "", "IDCLIEXT": "", "CtaNomCliTit": "", "CtaHisEndRes": "", "CplEndCli": "", "EndCli": "", "OfertaTotal": "", "CtaOfeFinDtaVctExt": "0000-00-00", "ValPar": "", "linhamsg": "", "LinhamsgF": "", "NumCta": "", "CFISldPtsAcu": 0, "CFISldPtsMes": 0, "CFISldAtuPts": 0, "CFISldDtaVldBnsPen": "0000-00-00T00:00:00", "CFISldBnsPen": 0, "CFISldDtaVldPtsPrx": "0000-00-00T00:00:00", "CFISldPtsExp": 0, "NumeroSorte": "", "PSIIndUtiCfi": "", "ExisteMassivo": 0, "LocPag": "", "BdaCod": 0, "CtaOfeCusEfeMen": 0, "Codigo": "", "VisLojFat": false, "VisLojCod": false, "VisEncFat": false, "VisCodBar": false, "CtaNumPlsTitAti": "", "NomCliTitCPF": "", "FATARQ_TIPCABEC": "", "VisDtaVct": false, "VisOnlLim": false, "CtaExtTxaJroExt": 0, "CtaIndTipPes": "", "CtaNumCpf": "", "CtaHisEndResBai": "", "CtaHisEndResCep": "", "CtaHisEndResEst": "", "CtaHisEndResCid": "", "SdtOfeFinMult": { "SdtOfeFinMultItem": [ { "CtaOfeFinQtdPre": 0, "CtaOfeFinVlrPre": "0.00", "CtaOfeCusEfeMen": 0, "CtaOfeVlrEntFin": 0 } ] }, "SdtPrdSorteio": [ { "CtaNum": "", "UNGCod": 0, "ProCod": 0, "CtaProSorNum": 0, "CtaProSorSer": 0, "CtaProSorDta": 0, "PrdDsc": "" } ] } Un saludo. Luis Miyashita.

pmazzilli

05/03/21 14:51
Si, por el momento se tienen que cargar los PrivateClaim em forma individual. La ideal es implementar el parsing de todo el json más adelante. Los escenarios de uso de jwt (al menos al comienzo) no estaban pensado para json grandes. On Fri, Mar 5, 2021 at 2:30 PM Luis Miyashita


Back to gx-l