Classe tJWT
JSON Web Token (JWT) é um padrão aberto (RFC 7519) que define uma maneira compacta e independente de transmitir com segurança informações entre Cliente e Servidor como um objeto JSON. O token JWT é assinado digitalmente utilizando algoritmos de criptografia que podem ser verificados, bem como as informações contídas dentro dele. A grande vantagem de seu uso é que possibilita realizar comunicação segura de objetos JSON mesmo utilizando conexões inseguras como HTTP, é simples, leve e eficiente. Para maiores informações, recomenda-se a leitura da RFC: https://tools.ietf.org/html/rfc7519
Hierarquia
- tJWT
- tJWT
 
 
Observações
Exemplos
User Function testjwt()
  Local pubKey := PUBKEY()
  Local privKey := PRIVKEY()
  Local token:= ""
  // Cria um novo token
  token:= u_newtoken(pubKey,privKey)
  
  Sleep(5000)
  // Verifica Token
  u_vertoken(token,pubKey,privKey)
Return
// Criação e assinatura de token
User Function newtoken(pubKey,privKey)
  Local genToken := ""
  Local oTokenJWT := Nil
  Local claims := Nil
  Local aAudience := Nil
  
  // Instancia da classe
  oTokenJWT:=tJWT():New()
  
  // Configuração Token a ser criado e assinado.
  /// Definição das chaves publicas e privadas
  oTokenJWT:setPubKey(pubKey)
  oTokenJWT:setPrivKey(privKey)
  // issuer
  oTokenJWT:setIssuer("auth0")
  // types
  oTokenJWT:setType("JWS")
  // Audience pode setar uma string ou array de strings. Caso seja definido um array diferente, apenas os elementos
  //do tipo caracter serao adicionados.
  aAudience := {1,"Ronaldo","Carlos"}
  oTokenJWT:setAudience(aAudience)
  // Set audience pode ser definido de dois modos e um anula o outro.
  oTokenJWT:setAudience("Teste")
  // Define um conjunto de claims
  claims := JsonObject():new()
  claims['idade'] := 10
  claims['root'] := .T.
  claims['flag'] := 10.55555
  claims['nome'] := "Cristiano Ronaldo"
  claims['dir'] := { "home", "user", 10, 15.5, .T. }
  // Add Public Claim
  oTokenJWT:setPayloadClaim(claims)
  // tempo de expiração em segundos
  oTokenJWT:setExpiresAt(1000000)
  // criação do token com algoritimo rs256
  genToken := oTokenJWT:createToken("rs256")
  if (Len(genToken) == 0)
    conout("Erro na geração de token. Error: "+ oTokenJWT:getLastError())
  end if
  conout("Token gerado: " + genToken)
  FreeObj(oTokenJWT)
  FreeObj(claims)
Return genToken
// Verificação de token
User Function vertoken(token,pubKey,privKey)
  Local oTokenJWT := Nil
  Local ret := .F.
  // Instancia da classe
  oTokenJWT:=tJWT():New()
  /// Definição das chaves publicas e privadas
  oTokenJWT:setPubKey(pubKey)
  oTokenJWT:setPrivKey(privKey)
  // Seta o token gerado
  oTokenJWT:setToken(token)
  if(oTokenJWT:hasIssuer())
    conout("Issuer FOUND on claims.")
  else
    conout("Issuer NOT FOUND on claims.")
  endif
  if(oTokenJWT:hasPayloadClaim("root"))
    conout("ROOT FOUND on claims.")
  else
    conout("ROOT NOT FOUND on claims.")
  endif
  if(oTokenJWT:hasPayloadClaim("dir"))
    conout("DIR FOUND on claims.")
  else
    conout("DIR NOT FOUND on claims.")
  endif
  claims := JsonObject():new()
  claims['dir'] := { "home", "user", 10, 15.5, .T. }
  oTokenJWT:withClaim(claims)
  // Verifica
  ret:= oTokenJWT:verifyToken("rs256")
 
  if(!ret)
    Conout("Token invalido! Error: " + oTokenJWT:getLastError())
  else
   Conout("Token Valido!")
  End If
  FreeObj(oTokenJWT)
Return
Abrangência
17.3.0.19
Construtores
New
Cria um objeto tJWT para configuração, criação, assinatura e manipulação de Tokens.
Sintaxe
tJWT():New()
Retorno
| Nome | Tipo | Descrição | 
|---|---|---|
| oObj | object | Nova instância da classe tJWT | 
Exemplos
    Local oTokenJWT:= tJWT():New()
Métodos
A classe expõe os seguintes métodos:
createToken
Cria e assina um token no formato JWT.
Sintaxe
createToken( < cAlgo > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cAlgo | character | Indica qual o algoritmo que deverá ser utilizado para assinatura do token. | X | 
Exemplos
    Local genToken := oTokenJWT:createToken("RS256")
verifyToken
Verifica um determinado token com relação a assinatura, prazo de validade, JOSE Header e demais claims contidas nele.
Sintaxe
verifyToken( < cAlgo > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cAlgo | character | Indica qual o algoritmo que deverá ser utilizado para assinatura do token. | X | 
Exemplos
    Local ret:= oTokenJWT:verifyToken("RS256")
setToken
Define um token a ser verificado.
Sintaxe
setToken( < cToken > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cToken | character | Indica o token a ser definido para verificação. | X | 
Exemplos
    oTokenJWT:setToken("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJhdWQiOiJUZXN0ZSIsImRpciI6WyJob21lIiwidXNlciIsMTAsMTUuNSx0cnVlXSwiZXhwIjoxNTgwNzEzNzY3LCJmbGFnIjoxMC41NTU1NSwiaWF0IjoxNTc5NzEzNzY3LCJpZGFkZSI6MTAsImlzcyI6ImF1dGgwIiwibm9tZSI6IlBhdWxvIFRvdm8iLCJyb290Ijp0cnVlfQ.Yv1FxzdmEGs8quRhn5kuLvS6e2MLMoLg24HP0SqAHWrdIHFoUlf8ulSGnA9QayJidJuprxkZa2JyAztAPr5f2kFFXojoXEbyIv85pXZp3swt7omS0JD92V9cDkGyROfRdn4V6BkzvV3sL2d2hdiBrl-CrOo0HTDAD4exlgB7tXprd-LGZwkq_OSJ2QjoeNvuyHXwSwpVJzz1ZINkb82jkpUvOjXkGW8JqDsBPgMKX_0a5K2cUBlq0m9dKDyyRAMP54JZDttL1aO894l_S200grNB1LGnTpoa6KZEk4W8yxH7cnQVd_8OpRHo_0hJ52o0t62QMOQDeZVsltxs9gfANA")
getLastError
Obtem o registro de erro da última operação executada sem sucesso.
Sintaxe
getLastError()
Exemplos
    conout("Erro na geração de token. Error: "+ oTokenJWT:getLastError())
setAlgorithm
Define o parâmetro "alg" do Header de um token JWT. Este parâmetro define o algoritmo que será usado na assinatura do Token. Normalmente não é preciso definir essa informação pois será preenchida automaticamente na assinatura do token. Os seguintes algoritmos são suportados: HS256, RS256, RS512, PS256, PS384, PS512 e ES256.
Sintaxe
setAlgorithm( < cAlg > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cAlg | character | Indica o algoritmo que será usado na assinatura do Token. | X | 
Exemplos
    oTokenJWT:setAlgorithm("HS256")
setType
Define o parâmetro (também conhecido por claim) "typ" (Type) do Header de um token JWT. Este parâmetro define o tipo de token JWT. De acordo com a RFC, os tipos conhecidos são: JSON Web Signature (JWS) e JSON Web Encryption (JWE).
Sintaxe
setType( < cType > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cType | character | Indica o tipo de token. | X | 
Exemplos
    oTokenJWT:setType("JWS")
setContentType
Define o parâmetro (também conhecido por claim) "cty" (Content Type) do Header de um token JWT. Este parâmetro define o tipo de conteúdo de um token JWT. De acordo com a RFC, os tipos conhecidos são: JSON Web Signature (JWS) e JSON Web Encryption (JWE).
Sintaxe
setContentType( < cContentType > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cContentType | character | Indica o tipo de token. | X | 
Exemplos
    oTokenJWT:setContentType("JWS")
setKeyId
Define o parâmetro (também conhecido por claim) "kid" (Key ID) do Header de um token JWT. Estê parâmetro consiste em uma chave de identificação "string-based" que pode ser utilizada para validação do toke. Esta claim está disponível na especificação JWS e seu uso é opcional.
Sintaxe
setKeyId( < cKeyId > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cKeyId | character | Indica o ID da chave. | X | 
Exemplos
    oTokenJWT:setKeyId("78b4cf23656dc395364f1b6c02907691f2cdffe1")
setIssuer
Define a claim reservada "iss" (Issuer) do Payload de um token JWT. Consiste na definição da entidade emissora do token. O uso dessa claim é opcional mas recomendado.
Sintaxe
setIssuer( < cIssuer > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cIssuer | character | Indica o emissor do token. | X | 
Exemplos
    oTokenJWT:setIssuer("http://myapi.com")
setSubject
Define a claim reservada "sub" (Subject) do Payload de um token JWT. Consiste na definição do identificador que representa o assunto do token JWT. O uso dessa claim é opcional.
Sintaxe
setSubject( < cSubject > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cSubject | character | Indica subject do token. | X | 
Exemplos
    oTokenJWT:setSubject("1234567890")
setAudience
Define a claim reservada "aud" (Audience) do Payload de um token JWT. De acordo com a RFC, identifica os destinatários que o JWT é destinado.
Sintaxe
setAudience( < aAud > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| aAud | variant | Indica uma lista de nomes (Array) ou apenas um nome (String). No caso da lista, tipos diferentes de string serão ignorados. | X | 
Exemplos
    Local aAudience := {"Paulo","Ronaldo","Carlos"}
    oTokenJWT:setAudience(aAudience)
setExpiresAt
Define a claim reservada "exp" (Expiration Time) do Payload de um token JWT. Define o tempo de expiração em segundos.
Sintaxe
setExpiresAt( < nSec > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| nSec | numeric | Indica o tempo de expiração em segundos. | X | 
Exemplos
  // Tempo de expiração configurado para 24horas. ( 24x60x60 )
  oTokenJWT:setExpiresAt(86400)
setNotBefore
Define a claim reservada "nfb" (Not Before) do Payload de um token JWT. Define o tempo antes do qual o JWT não deve ser aceito para processamento.
Sintaxe
setNotBefore( < nSec > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| nSec | numeric | Indica o tempo em segundos. | X | 
Exemplos
  // Configurado para 1horas. ( 1x60x60 )
  oTokenJWT:setNotBefore(3600)
setIssuedAt
Define a claim reservada "iat" (Issue At) do Payload de um token JWT. Define a data e hora em que o toke JWT foi gerado no formato de timestamp em segundos. Por default, no momento de geração do token, internamente este valor é definido automaticamente.
Sintaxe
setIssuedAt( < nSec > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| nSec | numeric | Indica o data e hora no formato de um timestamp. | X | 
Exemplos
  Local cData, cHora, nSecs
  Local oTokenJWT := Nil
  oTokenJWT:=tJWT():New()
  cData := "2020/02/13"
  cHora := "20:10:35"
  nSecs:= oTokenJWT:encodeTime(cData, cHora)
  oTokenJWT:setIssuedAt(nSecs)
setId
Define a claim reservada "jti" (JWT ID) do Payload de um token JWT. Define um identificador único para um token JWT.
Sintaxe
setId( < cID > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cID | character | Indica ID para o token JWT. | X | 
Exemplos
  oTokenJWT:setId("1580137200")
setPayloadClaim
Define uma ou mais claims publicas ou privadas no Payload de um token JWT.
Sintaxe
setPayloadClaim()
Exemplos
  claims := JsonObject():new()
  claims['idade'] := 10
  claims['root'] := .T.
  claims['flag'] := 10.55555
  claims['nome'] := "Paulo"
  claims['dir'] := { "home", "user", 10, 15.5, .T. }
  // Add Public Claim
  oTokenJWT:setPayloadClaim(claims)
setHeaderClaim
Define uma ou mais claims no Header de um token JWT.
Sintaxe
setHeaderClaim()
Exemplos
  claims := JsonObject():new()
  claims['idade'] := 10
  claims['root'] := .T.
  claims['flag'] := 10.55555
  claims['nome'] := "Paulo"
  claims['dir'] := { "home", "user", 10, 15.5, .T. }
  // Add Header Claim
  oTokenJWT:setHeaderClaim(claims)
setPubKey
Configura chave publica para verificar assinatura de Token.
Sintaxe
setPubKey( < cPubKey > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cPubKey | character | Chave publica . | X | 
Exemplos
  Local pubKey := PUBKEY()
  oTokenJWT:setPubKey(pubKey)
setPrivKey
Configura chave privada para assinatura de Token.
Sintaxe
setPrivKey( < cPubKey > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cPubKey | character | Chave privada. | X | 
Exemplos
  Local privKey := PRIVKEY()
  oTokenJWT:setPrivKey(privKey)
setSecretKey
Configura uma senha para assinatura de Token.
Sintaxe
setSecretKey( < cSecretKey > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cSecretKey | character | Senha para assinatura de token. | X | 
Exemplos
  oTokenJWT:setSecretKey("secret")
hasIssuer
Verifica se o issuer ("iss") está presente no Token.
Sintaxe
hasIssuer()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasIssuer()
hasSubject
Verifica se o Subject ("sub") está presente no Token.
Sintaxe
hasSubject()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasSubject()
hasAudience
Verifica se a Claim "aud" (Audience) está presente no Token.
Sintaxe
hasAudience()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasAudience()
hasExpiresAt
Verifica se a Claim "exp" (Expiration Time) está presente no Token.
Sintaxe
hasExpiresAt()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasExpiresAt()
hasNotBefore
Verifica se a Claim "nfb" (Not Before) está presente no Token.
Sintaxe
hasNotBefore()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasNotBefore()
hasIssuedAt
Verifica se a Claim "iat" (Issued At) está presente no Token.
Sintaxe
hasIssuedAt()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasIssuedAt()
hasId
Verifica se a Claim "jti" (JWT ID) está presente no Token.
Sintaxe
hasId()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasID()
hasAlgorithm
Verifica se o parâmetro de Header "alg" (Algortihm) está presente no Token.
Sintaxe
hasAlgorithm()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasAlgorithm()
hasType
Verifica se o parâmetro de Header "typ" (Type) está presente no Token.
Sintaxe
hasType()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasType()
hasContentType
Verifica se o parâmetro de Header "cty" (Content Type) está presente no Token.
Sintaxe
hasContentType()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasContentType()
hasKeyId
Verifica se o parâmetro de Header "kid" (Key ID) está presente no Token.
Sintaxe
hasKeyId()
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasKeyId()
hasPayloadClaim
Verifica se uma determinada Claim do Payload está presente no Token.
Sintaxe
hasPayloadClaim( < cClaim > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cClaim | character | Indica a claim a ser verificada. | X | 
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasPayloadClaim("nome")
hasHeaderClaim
Verifica se um determinado Parâmetro do Header está presente no Token.
Sintaxe
hasHeaderClaim( < cParam > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cParam | character | Indica o parâmetro a ser verificado. | X | 
Exemplos
  Local ret:= .F.
  ret:= oTokenJWT:hasHeaderClaim("testeid")
withIssuer
Define um issuer que será checado durante a verificação do token JWT.
Sintaxe
withIssuer( < cIssuer > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cIssuer | character | Indica o Issuer a ser checado. | X | 
Exemplos
  Local ret:= .F.
  oTokenJWT:withIssuer("Auth0")
  ret:= oTokenJWT:verifyToken("rs256")
withSubject
Define um Subject que será checado durante a verificação do token JWT.
Sintaxe
withSubject( < cSubject > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cSubject | character | Indica o Subject a ser checado. | X | 
Exemplos
  Local ret:= .F.
  oTokenJWT:withSubject("1234567890")
  ret:= oTokenJWT:verifyToken("rs256")
withAudience
Define uma lista ou apenas uma Audience que será checada durante a validação de um token. Caso seja definida uma lista, somente será valido se todos os elementos estiverem contido no token.
Sintaxe
withAudience( < cAudience > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cAudience | variant | Indica uma lista de Audience (Array) ou apenas um Audience (String). No caso da lista, tipos diferentes de string serão ignorados. | X | 
Exemplos
  Local ret:= .F.
  oTokenJWT:withAudience("testex")
  ret:= oTokenJWT:verifyToken("RS256")
  aAudience := {"Paulo","Ronaldo","Carlos","Zequinha"}
  oTokenJWT:withAudience(aAudience)
  ret:= oTokenJWT:verifyToken("RS256")
withId
Define um JWT ID (jti) que será checada durante a verificação do token JWT.
Sintaxe
withId( < cID > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cID | character | Indica ID para ser checado | X | 
Exemplos
  Local ret:= .F.
  oTokenJWT:withId("1580137200")
  ret:= oTokenJWT:verifyToken("rs256")
withClaim
Define um conjunto ou apenas uma claim para ser checada durante a validação de um token.
Sintaxe
withClaim()
Exemplos
  Local ret:= .F.
  claims := JsonObject():new()
  claims['idade'] := 10
  claims['root'] := .T.
  claims['flag'] := 10.66666
  claims['nome'] := "Cristiano Ronaldo"
  claims['dir'] := { "home", "user", 10, 15.5, .T. }
  oTokenJWT:withClaim(claims)
  ret:= oTokenJWT:verifyToken("rs256")
encodeTime
Transforma uma informação de tempo em um valor em segundos considerando o epoch, que é o número de segundos decorridos desde 1º de janeiro de 1970 (meia-noite UTC / GMT). Essa informação de tempo pode ser um conjunto Data e Hora ou apenas um valor em segundos.
Sintaxe
encodeTime( < cData >, [ cHora ] )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| cData | variant | Pode ser do tipo Caracter indicando a Data que deve estar no formato yyyy/mm/dd, ou uma informação do tipo numérica informando um valor em segundos. Caso o valor seja segundos, não será necessário informar o segundo parâmetro. Ex: 2020/02/25 ou 300 segundos (5 minutos - 5 * 60). | X | |
| cHora | character | Indica a Hora que deve estar no formato hh:mm:ss. O valor default é 00:00:00. Ex: 20:05:45 | 
Exemplos
  Local cData, cHora, timeEncode
  Local oTokenJWT:= Nil
  cData := "2020/02/13"
  cHora := Time()
  conout("Data: " + cData + "Hora: " + cHora)
  timeEncode:= oTokenJWT:encodeTime(cData, cHora)
  // Checagem para verificar se foi transformado com sucesso.
  if(timeEncode == 0)
    Conout("Error: " + oTokenJWT:getLastError())
  end if
  Conout("timeEncode= "+ cValToChar(timeEncode))
decodeTime
Decodifica um valor em segundos para Data e Hora no formato "human-readable" "yyyy/mm/dd hh:mm:ss" ou seja, legível e de facil entendimento. A decodificação leva em consideração o epoch, que é o número de segundos decorridos desde 1º de janeiro de 1970 (meia-noite UTC / GMT). Veja maiores informações sobre epoch em https://www.epochconverter.com.
Sintaxe
decodeTime( < nSec > )
Parâmetros
| Nome | Tipo | Descrição | Obrigatório | Referência | 
|---|---|---|---|---|
| nSec | numeric | Indica o valor em segundos | X | 
Exemplos
  Local nSecs, timeDecode
  Local oTokenJWT:= Nil
  // Instancia da classe
  oTokenJWT:=tJWT():New()
  // "2020/02/13 20:10:35"
  nSecs := 1581635435
  timeDecode := oTokenJWT:decodeTime(nSecs)
  if (Len(timeDecode) == 0)
    Conout("Error: " + oTokenJWT:getLastError())
  end if
  conout("timeDecode= "+timeDecode)
clearWithClaim
Limpa a lista de "WithClaim" utilizadas durante a validação e verificação de conteúdo de um token.
Sintaxe
clearWithClaim()
Exemplos
  claimsCheck := JsonObject():new()
  claimsCheck['idade'] := 10
  claimsCheck['root'] := .T.
  claimsCheck['flag'] := 10.66666
  claimsCheck['nome'] := "Cristiano Ronaldo"
  claimsCheck['dir'] := { "home", "user", 10, 15.5, .F. }  // valor alterado
  oTokenJWT:withClaim(claimsCheck)
  ret:= oTokenJWT:verifyToken("rs256")
  if (!ret)
    Conout("token verification error")
  end if
  // primeiro faço uma limpeza das claims configuradas anteriormente.
  oTokenJWT:clearWithClaim()
  claimsCheck:FromJson("")   // limpa o objeto
  claimsCheck['idade'] := 10
  oTokenJWT:withClaim(claimsCheck)
  ret:= oTokenJWT:verifyToken("rs256")
  if (!ret)
    Conout("token verification error")
  end if
Propriedades
A classe expõe as seguintes propriedades:
token
Armazena o último token criado.
| Tipo | Valor Padrão | Somente Leitura | 
|---|---|---|
| character | "" | N |