{"id":974,"date":"2025-01-27T09:40:35","date_gmt":"2025-01-27T12:40:35","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=974"},"modified":"2025-02-03T07:50:39","modified_gmt":"2025-02-03T10:50:39","slug":"autenticacao-com-jwt-em-apis-usando-delphi-horse","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/autenticacao-com-jwt-em-apis-usando-delphi-horse\/","title":{"rendered":"Autentica\u00e7\u00e3o com JWT em APIs usando Delphi Horse"},"content":{"rendered":"\n<p>No mundo das APIs modernas, a seguran\u00e7a \u00e9 um dos aspectos mais cr\u00edticos. Garantir que somente usu\u00e1rios autorizados possam acessar recursos protegidos \u00e9 essencial. E \u00e9 aqui que o <strong>JWT (JSON Web Token)<\/strong> entra em cena. Este m\u00e9todo de autentica\u00e7\u00e3o \u00e9 amplamente utilizado devido \u00e0 sua efici\u00eancia, flexibilidade e compatibilidade com diversas linguagens de programa\u00e7\u00e3o.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Se voc\u00ea j\u00e1 desenvolve APIs em <strong>Delphi Horse<\/strong>, sabe o quanto esse framework \u00e9 \u00e1gil e poderoso para criar aplica\u00e7\u00f5es web e RESTful. Mas integrar um mecanismo de autentica\u00e7\u00e3o robusto como o JWT pode parecer um desafio para quem est\u00e1 come\u00e7ando.<\/p>\n\n\n\n<p>Neste artigo, vamos descomplicar o uso do JWT com o Delphi Horse. Voc\u00ea aprender\u00e1 como proteger suas rotas de API, validar tokens e at\u00e9 mesmo adicionar informa\u00e7\u00f5es personalizadas para enriquecer sua autentica\u00e7\u00e3o. Tudo isso de forma pr\u00e1tica, com exemplos de c\u00f3digo e explica\u00e7\u00f5es claras.<\/p>\n\n\n\n<p>Preparado? Vamos direto ao que interessa: seguran\u00e7a simplificada com Delphi Horse e JWT!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>O que \u00e9 JWT e como funciona?<\/strong><\/h3>\n\n\n\n<p>O <strong>JWT (JSON Web Token)<\/strong> \u00e9 uma solu\u00e7\u00e3o amplamente utilizada para autentica\u00e7\u00e3o e troca de informa\u00e7\u00f5es seguras entre sistemas. Ele \u00e9 baseado em um padr\u00e3o aberto (RFC 7519) e utiliza um formato compacto e autocontido para transmitir dados entre partes.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Componentes do JWT<\/strong><\/h4>\n\n\n\n<p>O token JWT \u00e9 composto por tr\u00eas partes separadas por pontos (<code>.<\/code>), formando uma string no seguinte formato:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >header.payload.signature\n<\/pre><\/div>\n\n\n\n<p>Cada parte desempenha um papel espec\u00edfico:<\/p>\n\n\n\n<p>1. <strong>Header<\/strong><br>O cabe\u00e7alho cont\u00e9m metadados sobre o token, incluindo:<ul><li><strong>Algoritmo de assinatura<\/strong> usado para proteger o token, como HMAC SHA256 ou RSA.<\/li><li><strong>Tipo de token<\/strong>, geralmente definido como <code>JWT<\/code>.<\/li><\/ul>Exemplo de um header em JSON:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >{\n    \"alg\": \"HS256\",\n    \"typ\": \"JWT\"\n}\n<\/pre><\/div>\n\n\n\n<p>2. <strong>Payload<\/strong><br>O payload armazena as informa\u00e7\u00f5es que queremos transmitir. Ele cont\u00e9m &#8220;claims&#8221;, que s\u00e3o declara\u00e7\u00f5es como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Claims registrados<\/strong>: Padr\u00f5es definidos na especifica\u00e7\u00e3o, como <code>sub<\/code> (identifica\u00e7\u00e3o do usu\u00e1rio), <code>exp<\/code> (data de expira\u00e7\u00e3o), e <code>iat<\/code> (data de emiss\u00e3o).<\/li>\n\n\n\n<li><strong>Claims personalizados<\/strong>: Dados adicionais espec\u00edficos da sua aplica\u00e7\u00e3o, como permiss\u00f5es, pap\u00e9is, etc.<\/li>\n<\/ul>\n\n\n\n<p>Exemplo de um payload t\u00edpico:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >{\n    \"sub\": \"1234567890\",\n    \"name\": \"John Doe\",\n    \"admin\": true,\n    \"iat\": 1516239022\n}\n<\/pre><\/div>\n\n\n\n<p>3. <strong>Signature<\/strong><br>A assinatura \u00e9 a garantia de que o token n\u00e3o foi alterado. Ela \u00e9 gerada combinando o <strong>header<\/strong> e o <strong>payload<\/strong> com uma chave secreta e o algoritmo especificado.<\/p>\n\n\n\n<p>A f\u00f3rmula para criar a assinatura \u00e9:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >HMACSHA256(\n  base64UrlEncode(header) + \".\" + base64UrlEncode(payload),\n  secret\n)\n<\/pre><\/div>\n\n\n\n<p>A assinatura resultante \u00e9 anexada ao token e \u00e9 validada pelo servidor para confirmar sua autenticidade.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Por que usar JWT?<\/strong><\/h4>\n\n\n\n<p>O JWT possui vantagens significativas, especialmente em arquiteturas RESTful:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Autossufici\u00eancia<\/strong><br>Como o token cont\u00e9m todas as informa\u00e7\u00f5es necess\u00e1rias para autentica\u00e7\u00e3o, n\u00e3o \u00e9 necess\u00e1rio consultar o banco de dados a cada requisi\u00e7\u00e3o, reduzindo a carga no servidor.<\/li>\n\n\n\n<li><strong>Formato Compacto<\/strong><br>O JWT utiliza codifica\u00e7\u00e3o Base64URL, tornando-o eficiente para transmiss\u00e3o em cabe\u00e7alhos HTTP ou URLs.<\/li>\n\n\n\n<li><strong>Flexibilidade<\/strong><br>Ele pode ser usado para autentica\u00e7\u00e3o de usu\u00e1rios, autoriza\u00e7\u00e3o de acesso (quem pode fazer o qu\u00ea), e at\u00e9 para troca segura de informa\u00e7\u00f5es entre servi\u00e7os.<\/li>\n\n\n\n<li><strong>Compatibilidade<\/strong><br>Por ser baseado em um padr\u00e3o aberto, o JWT pode ser usado em praticamente qualquer linguagem de programa\u00e7\u00e3o e integrado a diversas plataformas.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Fluxo de Funcionamento do JWT<\/strong><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Autentica\u00e7\u00e3o Inicial<\/strong>\n<ul class=\"wp-block-list\">\n<li>O cliente (por exemplo, um aplicativo ou navegador) envia as credenciais de login ao servidor (usu\u00e1rio e senha).<\/li>\n\n\n\n<li>O servidor valida as credenciais e, se corretas, gera um token JWT contendo as informa\u00e7\u00f5es do usu\u00e1rio e o envia ao cliente.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Uso do Token<\/strong>\n<ul class=\"wp-block-list\">\n<li>O cliente armazena o token (geralmente no armazenamento local ou cookies).<\/li>\n\n\n\n<li>Em cada requisi\u00e7\u00e3o subsequente, o token \u00e9 enviado no cabe\u00e7alho <code>Authorization<\/code> com o formato <code>Bearer &lt;token><\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Valida\u00e7\u00e3o no Servidor<\/strong>\n<ul class=\"wp-block-list\">\n<li>O servidor verifica a assinatura do token e valida informa\u00e7\u00f5es como expira\u00e7\u00e3o (<code>exp<\/code>) e emissor (<code>iss<\/code>).<\/li>\n\n\n\n<li>Se v\u00e1lido, o acesso ao recurso solicitado \u00e9 concedido.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Quando usar JWT?<\/strong><\/h4>\n\n\n\n<p>O JWT \u00e9 ideal para cen\u00e1rios onde:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>APIs RESTful precisam ser protegidas sem estado (stateless).<\/li>\n\n\n\n<li>Existe a necessidade de autenticar usu\u00e1rios em m\u00faltiplos servi\u00e7os ou sistemas.<\/li>\n\n\n\n<li>Voc\u00ea precisa de uma solu\u00e7\u00e3o port\u00e1til e compat\u00edvel entre diversas plataformas.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Autentica\u00e7\u00e3o com JWT em APIs usando Delphi Horse<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><\/h3>\n\n\n\n<p>No mundo das aplica\u00e7\u00f5es RESTful, a seguran\u00e7a \u00e9 um ponto cr\u00edtico. Quando lidamos com APIs, \u00e9 essencial garantir que apenas usu\u00e1rios ou sistemas autorizados acessem os recursos dispon\u00edveis. Para isso, o uso de <strong>JWT (JSON Web Token)<\/strong> \u00e9 uma das pr\u00e1ticas mais comuns e eficazes.<\/p>\n\n\n\n<p>Neste artigo, vamos criar um exemplo pr\u00e1tico com <strong>Delphi Horse<\/strong>, implementando duas APIs:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>API de Autentica\u00e7\u00e3o<\/strong>: Respons\u00e1vel por gerar o token JWT contendo o <strong>CNPJ<\/strong> do cliente como uma claim personalizada.<\/li>\n\n\n\n<li><strong>API de Neg\u00f3cio (Business)<\/strong>: Protegida com JWT, valida os tokens recebidos e permite acesso aos recursos apenas para usu\u00e1rios autenticados.<\/li>\n<\/ol>\n\n\n\n<p>Voc\u00ea aprender\u00e1 como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Criar tokens JWT com claims personalizadas.<\/li>\n\n\n\n<li>Proteger rotas usando middleware para valida\u00e7\u00e3o de tokens.<\/li>\n\n\n\n<li>Configurar e conectar duas APIs que trabalham juntas.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Criando a API de Autentica\u00e7\u00e3o<\/strong><\/h3>\n\n\n\n<p>A API de autentica\u00e7\u00e3o ser\u00e1 respons\u00e1vel por gerar tokens JWT com informa\u00e7\u00f5es personalizadas, como o <strong>CNPJ<\/strong>. Esse token ser\u00e1 usado pela API de neg\u00f3cio para validar o cliente.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Configura\u00e7\u00e3o Inicial<\/strong><\/h4>\n\n\n\n<p>Primeiro, configure o projeto instalando as depend\u00eancias necess\u00e1rias com o <strong>Boss<\/strong>:<\/p>\n\n\n\n<p>N\u00e3o vou entrar em detalhes sobre a cria\u00e7\u00e3o de uma API Horse, suponho que j\u00e1 saiba como fazer isso. O que precisar\u00e1 a mais nesse artigo \u00e9 adicionar a biblioteca JOSE do Paolo Rossi.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >boss install github.com\/paolo-rossi\/delphi-jose-jwt\n<\/pre><\/div>\n\n\n\n<p>Em seguida vamos criar uma classe para auxiliar na cri\u00e7\u00e3o de CLAIMS personalizados. Os claims s\u00e3o como campos que podemos armazenar dentro do token. Existem os claims registrados, obrigat\u00f3rios do JWT e os claims personalizados. Nesse exemplo vamos simular a adi\u00e7\u00e3o de um CNPJ dentro do token.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >unit Autenticacao.CustomClaim;\n\ninterface\n\nuses\n  JOSE.Core.JWT, JOSE.Types.JSON;\n\ntype\n  TCustomClaims = class(TJWTClaims)\n  private\n    function GetCNPJ: string;\n    procedure SetCNPJ(const ACNPJ: string);\n  public\n    property CNPJ: string read GetCNPJ write SetCNPJ;\n  end;\n\nimplementation\n\nuses\n  JOSE.Types.Bytes;\n\nfunction TCustomClaims.GetCNPJ: string;\nbegin\n  Result := TJSONUtils.GetJSONValue('CNPJ', FJSON).AsString;\nend;\n\nprocedure TCustomClaims.SetCNPJ(const ACNPJ: string);\nbegin\n  TJSONUtils.SetJSONValueFrom&lt;string&gt;('CNPJ', ACNPJ, FJSON);\nend;\n\nend.\n<\/pre><\/div>\n\n\n\n<p>Essa classe adiciona o campo <code>CNPJ<\/code> ao payload do token JWT.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Implementando o Endpoint de Gera\u00e7\u00e3o do Token<\/strong><\/h4>\n\n\n\n<p>No DPR da nosssa api de autentica\u00e7\u00e3o, teremos um endpoint \/token para ser chamado e gerar um token de autentica\u00e7\u00e3o, veja como fazemos.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >program autenticacao;\n\n{$APPTYPE CONSOLE}\n\nuses\n  Horse, Horse.Jhonson, JOSE.Core.JWT, System.JSON, System.DateUtils, Autenticacao.CustomClaim;\n\nbegin\n  THorse.Use(Jhonson);\n\n  THorse.Post('\/token', \n    procedure(Req: THorseRequest; Res: THorseResponse)\n    var\n      LToken: TJWT;\n      LCompactToken: string;\n      LCNPJ: string;\n      LClaims: TCustomClaims;\n      LExpiracao: TDateTime;\n    begin\n      Req.Headers.TryGetValue('CNPJ', LCNPJ);\n\n      if LCNPJ.IsEmpty then\n      begin\n        Res.Send&lt;TJSONObject&gt;(TJSONObject.Create.AddPair('Erro', 'Informe o CNPJ'))\n           .Status(THTTPStatus.BadRequest);\n        Exit;\n      end;\n\n      LToken := TJWT.Create(TCustomClaims);\n      try\n        LClaims := TCustomClaims(LToken.Claims);\n        LClaims.Issuer := 'Adriano Santos Treinamentos';\n        LClaims.CNPJ := LCNPJ;\n        LClaims.Expiration := IncMinute(Now, 10);\n\n        LCompactToken := TJOSE.SHA256CompactToken('adrianosantostreina', LToken);\n        \n        Res.Send&lt;TJSONObject&gt;(TJSONObject.Create\n                                .AddPair('Token', LCompactToken)\n                                .AddPair('Expiracao', DateToISO8601(LClaims.Expiration)))\n           .Status(THTTPStatus.Created);\n      finally\n        LToken.Free;\n      end;\n    end);\n\n  THorse.Get('\/ping', \n    procedure(Req: THorseRequest; Res: THorseResponse)\n    begin\n      Res.Send&lt;TJSONObject&gt;(TJSONObject.Create.AddPair('Retorno', 'Funcionando'));\n    end);\n\n  THorse.Listen(9000);\nend.\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Teste da API de Autentica\u00e7\u00e3o<\/strong><\/h4>\n\n\n\n<p>Envie uma requisi\u00e7\u00e3o para o endpoint <code>\/token<\/code> com o <strong>CNPJ<\/strong> no header um token ser\u00e1 retornado. Use o Postman, Inmsonia ou crie um pequeno projeto para fazer a requisi\u00e7\u00e3o. Um exemplo de token gerado pode ser visto abaixo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >{\n  \"Token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJBZHJpYW5vIFNhbnRvcyBUcmVpbmFtZW50b3MiLCJDTlBKIjoiMTQ0MTcyODIwMDAxMzIiLCJleHAiOjE3Mzc5ODEzMjN9.RtMr3HAfF-7C_qL6nWCn3OFuzPt1lmJczN2UyRGCWo0\",\n  \"Expiracao\": \"2025-135-27 09:35:23\"\n}<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Criando a API de Neg\u00f3cio (Business)<\/strong><\/h3>\n\n\n\n<p>A API de neg\u00f3cio utiliza o middleware <code>HorseJWT<\/code> para validar tokens e proteger rotas. Esse middleware pode ser encontrado na se\u00e7\u00e3o &#8220;Official Middlewares&#8221; no github da HashLoad.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Configura\u00e7\u00e3o do Middleware JWT<\/strong><\/h4>\n\n\n\n<p>No projeto da API de neg\u00f3cio, implemente a valida\u00e7\u00e3o de tokens no arquivo principal:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >program business;\n\n{$APPTYPE CONSOLE}\n\nuses\n  Horse, Horse.Jhonson, Horse.JWT, JOSE.Core.JWT, Autenticacao.CustomClaim;\n\nbegin\n  THorse.Use(Jhonson);\n\n  THorse.Use(\n    HorseJWT('adrianosantostreina', \n      THorseJWTConfig.New.SessionClass(TCustomClaims)\n        .SkipRoutes(['\/ping', '\/version'])));\n\n  THorse.Get('\/ping', \n    procedure(Req: THorseRequest; Res: THorseResponse)\n    begin\n      Res.Send&lt;TJSONObject&gt;(TJSONObject.Create.AddPair('Retorno', 'Funcionando'));\n    end);\n\n  THorse.Get('\/clientes', \n    procedure(Req: THorseRequest; Res: THorseResponse)\n    begin\n      Res.Send&lt;TJSONObject&gt;(TJSONObject.Create.AddPair('Dados', 'Clientes'));\n    end);\n\n  THorse.Listen(3000);\nend.\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Teste da API de Neg\u00f3cio<\/strong><\/h4>\n\n\n\n<p>Fa\u00e7a uma requisi\u00e7\u00e3o para a rota protegida <code>\/clientes<\/code> enviando o token no cabe\u00e7alho. Agora atrav\u00e9s do Postman, fa\u00e7a uma requisi\u00e7\u00e3o enviando o token gerado na outra api. Caso esteja ok o token, voc\u00ea receber\u00e1 o conte\u00fado como abaixo, simulando o resultado de uma rota.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >{\n  \"Dados\": \"Clientes\"\n}\n<\/pre><\/div>\n\n\n\n<p>As rotas <code>\/ping<\/code> e <code>\/version<\/code> n\u00e3o est\u00e3o sendo protegidas pelo JWT, voc\u00ea pode notar isso na chamada ao <code>skiproutes<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >  THorse.Use(\n    HorseJWT('adrianosantostreina', \n      THorseJWTConfig.New.SessionClass(TCustomClaims)\n        .SkipRoutes(['\/ping', '\/version'])));<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Participe da Comunidade no Telegram<\/h3>\n\n\n\n<p>\ud83d\ude80 Quer continuar essa discuss\u00e3o e trocar ideias com outros desenvolvedores? Junte-se \u00e0 nossa comunidade no Telegram! L\u00e1, voc\u00ea pode comentar sobre o que achou deste artigo, tirar suas d\u00favidas e compartilhar suas experi\u00eancias com Delphi e ainda discutir ou tirar suas d\u00favidas sobre os mais variados temas em uma comunidade com mais de 1.000 desenvolvedores.<\/p>\n\n\n\n<p>\ud83d\udd17 <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\" target=\"_blank\" rel=\"noreferrer noopener\">Clique aqui para entrar na comunidade<\/a><\/p>\n\n\n\n<p>Te vejo l\u00e1!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>O que vir\u00e1 a seguir<\/strong>?<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Cria\u00e7\u00e3o de logs em APIs com Delphi Horse<\/strong><\/h4>\n\n\n\n<p>No pr\u00f3ximo artigo, vamos explorar como implementar logs em APIs desenvolvidas com Delphi Horse. Veremos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configura\u00e7\u00e3o de middleware para registrar requisi\u00e7\u00f5es e respostas.<\/li>\n\n\n\n<li>Boas pr\u00e1ticas para lidar com erros e gerar logs \u00fateis para depura\u00e7\u00e3o e an\u00e1lise.<\/li>\n<\/ul>\n\n\n\n<p>Com essas t\u00e9cnicas, voc\u00ea ter\u00e1 controle total sobre o comportamento de suas APIs, garantindo maior seguran\u00e7a e rastreabilidade.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h3>\n\n\n\n<p>Neste artigo, criamos duas APIs utilizando o <strong>Delphi Horse<\/strong> e implementamos um fluxo completo de autentica\u00e7\u00e3o com <strong>JWT<\/strong>, incluindo claims personalizadas como o <strong>CNPJ<\/strong>. Esse modelo \u00e9 altamente escal\u00e1vel e pode ser facilmente adaptado para aplica\u00e7\u00f5es maiores.<\/p>\n\n\n\n<p>Com essas ferramentas, voc\u00ea tem a base para criar aplica\u00e7\u00f5es RESTful seguras e eficientes.<\/p>\n\n\n\n<p>Se desejar expandir o tema, podemos explorar t\u00f3picos como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implementa\u00e7\u00e3o de permiss\u00f5es avan\u00e7adas.<\/li>\n\n\n\n<li>Uso de banco de dados para validar credenciais na autentica\u00e7\u00e3o.<\/li>\n\n\n\n<li>Monitoramento de APIs com ferramentas de log.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>No mundo das APIs modernas, a seguran\u00e7a \u00e9 um dos aspectos mais cr\u00edticos. Garantir que somente usu\u00e1rios autorizados possam acessar recursos protegidos \u00e9 essencial. E \u00e9 aqui que o JWT (JSON Web Token) entra em cena. Este m\u00e9todo de autentica\u00e7\u00e3o \u00e9 amplamente utilizado devido \u00e0 sua efici\u00eancia, flexibilidade e compatibilidade com diversas linguagens de programa\u00e7\u00e3o.<\/p>\n","protected":false},"author":1,"featured_media":978,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-974","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=974"}],"version-history":[{"count":6,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/974\/revisions"}],"predecessor-version":[{"id":982,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/974\/revisions\/982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/978"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}