<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guiller</title>
    <description>The latest articles on DEV Community by Guiller (@guillerbr).</description>
    <link>https://dev.to/guillerbr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F229178%2F20f7a3ef-1df6-419c-9869-ce5218ffd5cd.jpg</url>
      <title>DEV Community: Guiller</title>
      <link>https://dev.to/guillerbr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guillerbr"/>
    <language>en</language>
    <item>
      <title>How to issue your own token on Ethereum</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Wed, 05 Oct 2022 13:59:21 +0000</pubDate>
      <link>https://dev.to/guillerbr/how-to-issue-your-own-token-on-ethereum-3ga4</link>
      <guid>https://dev.to/guillerbr/how-to-issue-your-own-token-on-ethereum-3ga4</guid>
      <description>&lt;p&gt;In this tutorial, the aim is to walk you through the steps of setting up your account and issuing your first token on the Ethereum network using a single smart contract.&lt;br&gt;
The token will be a standard ERC20, will have the main functions and can be used as a general basis for more sophisticated applications than just transferring them.&lt;/p&gt;

&lt;p&gt;Ethereum address&lt;br&gt;
In this tutorial, we will use a testnet to issue the token, so you don't spend real Ether ETH. We will use the Ropsten Test network. To get started, go to MyEtherWallet (MEW) and create an account there.&lt;/p&gt;

&lt;p&gt;To get setup, click right corner, change network to Ropsten ( MyEtherWallet or MetaMask Wallet ) → click New Wallet → Enter a password you can remember → Download/save your Keystore file to a safe space → Save your private key in a safe space. The whole process of creating an account and connecting to the test network is very simple and we can go to the new pass0.&lt;/p&gt;

&lt;p&gt;ETH postman address -&lt;br&gt;
Address of your wallet, go to → View wallet information → Private key → Enter saved private key → Unlock your wallet and it should be there!&lt;br&gt;
Basically what you will have to do in simple terms:&lt;br&gt;
Download MetaMask from metamask.io.&lt;br&gt;
Select Ropsten Network.&lt;br&gt;
Select DEPOSIT.&lt;br&gt;
Claim 1 Ropsten ETH.&lt;br&gt;
Trigger a faucet to obtain ETH coins tests to create your token.&lt;br&gt;
Transact to the address you will use for the MyCrypto tutorial.&lt;/p&gt;

&lt;p&gt;Contract&lt;br&gt;
Download the smart contract that legendary Ethereum unicorn knight BokkyPooBah helped us make by clicking here. ⬅️&lt;br&gt;
You will be editing this code for your own token.&lt;/p&gt;

&lt;p&gt;Now let's get started:&lt;/p&gt;

&lt;p&gt;Open the contract you downloaded in your Text Editor.&lt;br&gt;
Go to Line 3–15 and see the comments section. Although this is a comments section, this will help you get on the path. For me, 0Fucks was my first :). Basically, you send someone 0Fucks when you don't care.&lt;br&gt;
Change Line 4 to your smart contract title&lt;br&gt;
Change Line 6 to the Ropsten Ethereum address you created in MyEtherWallet&lt;br&gt;
Change the symbol from line 7 to the respective currency name (keep it short)&lt;br&gt;
Change Line 8 to your token name&lt;/p&gt;

&lt;p&gt;Next:&lt;br&gt;
Go to line 102 and change "FucksToken" to "(YourTokenName)&lt;br&gt;
Do the same for line 115&lt;br&gt;
Go to line 116 and change the symbol name, the same as you did in the comments section&lt;br&gt;
Do the same for line 117&lt;br&gt;
Change line 120 address to be the same as you generated in MEW&lt;br&gt;
The same goes for Line 121&lt;/p&gt;

&lt;p&gt;For the decimal places and the total supply on Lines 118 and 119 you can leave it as is, however I will explain just for visibility. In the total offer, there are some considerations. The first is that the default (and maximum) has 18 decimal places, which means that a coin can be divided into 18 parts.&lt;br&gt;
The second is that, say, for example, you want to issue 100 tokens, in the total supply part you must put 100, followed by the number of decimal places you choose.&lt;br&gt;
Ex: If I want to issue 100 tokens, what I will put in the total supply is: 100000000000000000000; and so on.&lt;/p&gt;

&lt;p&gt;After that, we finish editing the code. Yes, that was easy. Now let's do some cool stuff...&lt;br&gt;
Go to &lt;a href="http://remix.ethereum.org/"&gt;http://remix.ethereum.org/&lt;/a&gt;&lt;br&gt;
In the browser / ballot.sol, paste the code you just edited! If something red appears, there is something wrong with the code. If there's a yellow warning, that's fine, we hope for the best.&lt;br&gt;
Now in Build → Details → Choose the token you are creating&lt;br&gt;
In ByteCode, press the to button to copy the ByteCode to the clipboard - (In this section, what may appear are different things in the ByteCode. What you should copy is the ByteCode of the “object”, adding 0x at the beginning. will have 0xByteCode.)&lt;/p&gt;

&lt;p&gt;Go to the MEW where we will start deploying the contract. Remember we want to be on the Ropsten Test Network so make sure the top right says&lt;br&gt;
Navigate to Contracts tab → Press Deploy Contract&lt;br&gt;
Paste your ByteCode in the ByteCode box. Your gas limit should update automatically&lt;br&gt;
Access your wallet by going to Private key → Enter your private key → Unlock your wallet&lt;br&gt;
Now press Sign transaction → Implement transaction&lt;br&gt;
ATTENTION: This is the moment when you must cross your fingers for the first time for a few seconds. 🤞&lt;br&gt;
Click on the tx transaction or go to &lt;a href="https://ropsten.etherscan.io"&gt;https://ropsten.etherscan.io&lt;/a&gt; to verify that the contract has been approved. If not, start over and try to figure out what you got wrong. If yes, you are basically Vitalik 2.0, be proud.&lt;br&gt;
If all goes well, this is a sample image of what you should be seeing.&lt;/p&gt;

&lt;p&gt;Now let's register this contract. Do that:&lt;br&gt;
On the Overview tab → Click on the contract address&lt;br&gt;
Go to Contract Code tab → Click Verify and Publish&lt;/p&gt;

&lt;p&gt;Almost there... The following steps are really important. So look carefully. Basically what we're doing here is trying to make sure the code fits what you say you're deploying and logging onto the network. FOREVER .&lt;br&gt;
So if you make mistakes, you are wrong forever. What a friend told me this on Blockchain:&lt;br&gt;
Do it right once or wrong forever.&lt;br&gt;
Now you have 5 things to do on this page.&lt;br&gt;
Make sure the contract address field matches the contract address you just deployed. Remember that the contract address is different from the MEW address you created, so make sure you don't confuse them.&lt;br&gt;
The contract name must match the code name, in my case it is the following: contract FucksToken. This was on line 102 of your code&lt;br&gt;
To check which version of the complier, go back to the remix page where you got the BYTECODE from and check the URL, the version of the complier will be there. In most cases it should be:&lt;br&gt;
v0.4.19 + commit.c4cbbb05.js, but you want to try the updated ones if by any chance that doesn't work.&lt;br&gt;
Under Optimization, choose No (we haven't enabled it before).&lt;br&gt;
Under ENTER SOLIDITY AGREEMENT CODE BELOW, copy the entire Remix code and paste it into this area. NOT BYTECODE, but the code itself. It can also be copied from your text editor.&lt;br&gt;
Now, leave the other fields blank and click Verify and Publish.&lt;br&gt;
But be aware... This is the moment you've been waiting for... It's about to happen!&lt;br&gt;
FINGERS CROSSED AGAIN BY VITALIK'S.&lt;/p&gt;

&lt;p&gt;The moment of truth...&lt;/p&gt;

&lt;p&gt;** Success!** &lt;/p&gt;

&lt;p&gt;If a successful page comes with green checkmarks and stuff, you've done it!&lt;br&gt;
If a red message appears... try again and see where you might have missed a step. I'm happy to help if you leave a comment below, but remember that Google is your best friend 😉&lt;br&gt;
To confirm it works, go to &lt;a href="https://ropsten.etherscan.io/"&gt;https://ropsten.etherscan.io/&lt;/a&gt; and check your MEW address, not the contract, but your public address. If you can see your coins there, now you can relax and live the crypto dream in peace! At least until the next BTC rally :)))))&lt;/p&gt;

&lt;p&gt;To be able to send these tokens, you need to login to your MEW account Viewing Wallet Information → Accessing and entering your Private Key → Unlocking Wallet → Select the Load Tokens option. After that, they will be transferable.&lt;/p&gt;

&lt;p&gt;How To Create Your Own Ethereum Token In An Hour (ERC20 + Verified)&lt;br&gt;
How to do an ICO on Ethereum in less than 20 minutes.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=o7xoy0gbHO8"&gt;https://www.youtube.com/watch?v=o7xoy0gbHO8&lt;/a&gt;&lt;br&gt;
&lt;a href="https://gist.github.com/Filip3Dev/9d32f54f35719f3b748c36ba75a4833a"&gt;https://gist.github.com/Filip3Dev/9d32f54f35719f3b748c36ba75a4833a&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://remix.ethereum.org/"&gt;http://remix.ethereum.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ethereum.github.io/browser-solidity"&gt;https://ethereum.github.io/browser-solidity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://faucet.metamask.io/"&gt;https://faucet.metamask.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>smartcontract</category>
      <category>web3</category>
    </item>
    <item>
      <title>Como emitir seu próprio token no Ethereum</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sat, 27 Aug 2022 15:33:21 +0000</pubDate>
      <link>https://dev.to/guillerbr/como-emitir-seu-proprio-token-no-ethereum-58nl</link>
      <guid>https://dev.to/guillerbr/como-emitir-seu-proprio-token-no-ethereum-58nl</guid>
      <description>&lt;p&gt;Neste tutorial,o objetivo é orientá-lo nas etapas de configuração da sua conta e emitir seu primeiro token na rede Ethereum usando um único contrato inteligente.&lt;br&gt;
O token será um ERC20 padrão, terá as principais funções e pode ser usado como base geral para aplicativos mais sofisticados do que apenas transferi-los.&lt;/p&gt;

&lt;p&gt;Endereço Ethereum&lt;br&gt;
Neste tutorial, usaremos uma rede de teste para emitir o token, para que você não gaste o Ether ETH real. Usaremos a rede Ropsten Test. Para começar, vá para MyEtherWallet (MEW) e crie uma conta lá.&lt;/p&gt;

&lt;p&gt;Para obter a configuração, clique no canto direito, altere a rede para Ropsten ( MyEtherWallet ou MetaMask Wallet ) → clique em Nova Carteira → Digite uma senha que você possa lembrar → Faça o download / salve o seu arquivo Keystore em um espaço seguro → Salve sua chave privada em um cofre espaço. Todo o processo de criação de conta e conexão na rede de teste é bem simples e podemos ir ao novo pass0.&lt;/p&gt;

&lt;h1&gt;
  
  
  Endereço da carteiro ETH -
&lt;/h1&gt;

&lt;p&gt;Endereço da sua carteira, vá para → Exibir informações da carteira → Chave privada → Digite a chave privada salva → Desbloqueie sua carteira e ela deve estar lá!&lt;br&gt;
Basicamente, o que você terá que fazer em termos simples:&lt;br&gt;
Faça o download do MetaMask em metamask.io .&lt;br&gt;
Selecione Rede Ropsten.&lt;br&gt;
Selecione DEPÓSITO.&lt;br&gt;
Reivindicação 1 Ropsten ETH.&lt;br&gt;
Acionar um faucet para obtenção de moedas ETH testes para criação do seu token.&lt;br&gt;
Transacione para o endereço que você usará para o tutorial em MyCrypto .&lt;/p&gt;

&lt;p&gt;Contrato&lt;br&gt;
Faça o download do contrato inteligente que o lendário cavaleiro unicórnio Ethereum, BokkyPooBah nos ajudou a fazer, clicando aqui . ⬅️&lt;br&gt;
Você estará editando este código para seu próprio token.&lt;/p&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;p&gt;Issue-your-own-ERC20-token/erc20&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pb4zUbkR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tg9nc1g7c2cizeu8vsnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pb4zUbkR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tg9nc1g7c2cizeu8vsnx.png" alt="Image description" width="755" height="412"&gt;&lt;/a&gt;_tutorial.sol at master · bitfwdcommunity/Issue-your-own-ERC20-token&lt;/p&gt;

&lt;p&gt;Agora vamos começar:&lt;/p&gt;

&lt;p&gt;Abra o contrato que você baixou no seu Editor de texto.&lt;br&gt;
Vá para a Linha 3–15 e veja a seção de comentários. Embora esta seja uma seção de comentários, isso o ajudará a seguir o caminho. Para mim, 0Fucks foi o meu primeiro :). Basicamente, você envia 0Fucks a alguém quando não se importa.&lt;br&gt;
Altere a Linha 4 para o título do seu contrato inteligente&lt;br&gt;
Altere a Linha 6 para o endereço Ropsten Ethereum que você criou no MyEtherWallet&lt;br&gt;
Altere o símbolo da linha 7 para o respectivo nome de moeda (mantenha-o curto)&lt;br&gt;
Altere a Linha 8 para o nome do seu token&lt;/p&gt;

&lt;p&gt;Próximo:&lt;br&gt;
Vá para a linha 102 e altere "FucksToken" para "(YourTokenName)&lt;br&gt;
Faça o mesmo para a linha 115&lt;br&gt;
Vá para a linha 116 e altere o nome do símbolo, o mesmo que você fez na seção de comentários&lt;br&gt;
Faça o mesmo para a linha 117&lt;br&gt;
Alterar o endereço da linha 120 para ser o mesmo que você gerou no MEW&lt;br&gt;
O mesmo vale para a Linha 121&lt;/p&gt;

&lt;p&gt;Para as casas decimais e o fornecimento total nas Linhas 118 e 119, você pode deixar como está, no entanto, explicarei apenas para obter visibilidade. Na oferta total, existem algumas considerações. O primeiro é que o padrão (e máximo) tem 18 casas decimais, o que significa que uma moeda pode ser dividida em 18 partes.&lt;br&gt;
A segunda é que, digamos, por exemplo, que você queira emitir 100 tokens, na parte do suprimento total você deve colocar 100, seguido pelo número de casas decimais que escolher.&lt;br&gt;
Ex: Se eu quiser emitir 100 tokens, o que colocarei no suprimento total é: 100000000000000000000; e por aí vai.&lt;/p&gt;

&lt;p&gt;Depois disso, terminamos a edição do código. Sim, isso foi fácil. Agora vamos fazer algumas coisas legais ...&lt;br&gt;
Vá para &lt;a href="http://remix.ethereum.org/"&gt;http://remix.ethereum.org/&lt;/a&gt;&lt;br&gt;
No navegador / ballot.sol, cole o código que você acabou de editar! Se algo vermelho aparecer, há algo errado no código. Se houver um aviso amarelo, tudo bem, esperamos o melhor.&lt;br&gt;
Agora em Compilar → Detalhes → Escolha o token que você está criando&lt;br&gt;
Em ByteCode, pressione o botão to para copiar o ByteCode para a área de transferência - (Nesta seção, o que pode aparecer são coisas diferentes no ByteCode. O que você deve copiar é o ByteCode do “objeto”, adicionando 0x no início. terá 0xByteCode.)&lt;/p&gt;

&lt;p&gt;Vá para o MEW, onde começaremos a implantar o contrato. Lembre-se de que queremos estar na Ropsten Test Network, portanto, verifique se o canto superior direito diz&lt;br&gt;
Navegue até a guia Contratos → Pressione Implantar contrato&lt;br&gt;
Cole seu ByteCode na caixa ByteCode. Seu limite de gás deve ser atualizado automaticamente&lt;br&gt;
Acesse sua carteira, acessando a Chave privada → Digite sua chave privada → Desbloqueie sua carteira&lt;br&gt;
Agora pressione Assinar transação → Implementar transação&lt;br&gt;
ATENÇÃO: Este é o momento em que você deve cruzar os dedos pela primeira vez durante alguns segundos. 🤞&lt;br&gt;
Clique na transação tx ou acesse &lt;a href="https://ropsten.etherscan.io"&gt;https://ropsten.etherscan.io&lt;/a&gt; para verificar se o contrato foi aprovado. Caso contrário, comece novamente e tente descobrir o que você errou. Se sim, você é basicamente o Vitalik 2.0, tenha orgulho.&lt;br&gt;
Se tudo der certo, esta é uma imagem de amostra do que você deveria estar vendo.&lt;/p&gt;

&lt;p&gt;Agora vamos registrar este contrato. Fazer isso:&lt;br&gt;
Na guia Visão geral → Clique no endereço do contrato&lt;br&gt;
Vá para a guia Código do contrato → Clique em Verificar e publicar&lt;/p&gt;

&lt;p&gt;Quase lá ... Os seguintes passos são realmente importantes. Então olhe com cuidado. Basicamente, o que estamos fazendo aqui é tentar garantir que o código se encaixe no que você diz que está implantando e registrando na rede. PARA SEMPRE .&lt;br&gt;
Então, se você cometer erros, estará errado para sempre. O que um amigo me disse isso no Blockchain:&lt;br&gt;
Faça certo uma vez ou erre para sempre.&lt;br&gt;
Agora você tem 5 coisas a fazer nesta página.&lt;br&gt;
Verifique se o campo de endereço do contrato corresponde ao endereço do contrato que você acabou de implantar. Lembre-se de que o endereço do contrato é diferente do endereço MEW que você criou, portanto, certifique-se de não confundi-los&lt;br&gt;
O nome do contrato deve corresponder ao do código, no meu caso é o seguinte: contract FucksToken. Isso estava na linha 102 do seu código&lt;br&gt;
Para verificar qual versão do complier, volte para a página de remix de onde você obteve o BYTECODE e verifique o URL, a versão do complier estará lá. Na maioria dos casos, deve ser: &lt;br&gt;
v0.4.19 + commit.c4cbbb05.js, mas você deseja tentar os atualizados, se por acaso isso não funcionar.&lt;br&gt;
Em Otimização , escolha Não (não a habilitamos antes).&lt;br&gt;
Em INSIRA O CÓDIGO DE CONTRATO DE SOLIDITY ABAIXO, copie todo o código do Remix e cole nessa área. NÃO O BYTECODE, mas o próprio código. Também pode ser copiado do seu editor de texto.&lt;br&gt;
Agora, deixe os outros campos em branco e clique em Verificar e publicar.&lt;br&gt;
Mas esteja ciente ... Este é o momento que você estava esperando ... Está prestes a acontecer!&lt;br&gt;
DEDOS CRUZADOS NOVAMENTE PELA VITALIK'S. &lt;/p&gt;

&lt;p&gt;O momento da verdade…&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                  Sucesso!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Se uma página de sucesso vier com marcas de verificação verdes e outras coisas, você conseguiu! &lt;br&gt;
Se aparecer uma mensagem vermelha ... tente novamente e veja onde você pode ter perdido um passo. Fico feliz em ajudar se você deixar um comentário abaixo, mas lembre-se de que o Google é seu melhor amigo 😉&lt;br&gt;
Para confirmar que funciona, vá para &lt;a href="https://ropsten.etherscan.io/"&gt;https://ropsten.etherscan.io/&lt;/a&gt; e verifique o seu endereço MEW, não o contrato, mas o seu endereço público. Se você pode ver suas moedas lá, agora pode relaxar e viver o sonho de criptografia em paz! Pelo menos até o próximo comício do BTC :)))))&lt;/p&gt;

&lt;p&gt;Para poder enviar esses tokens, você precisa acessar sua conta MEW Visualizando Informações da Carteira → Acessando e inserindo sua Chave privada → Desbloqueando Carteira → Selecione a opção Carregar Tokens. Depois disso, eles serão transferíveis.&lt;/p&gt;

&lt;p&gt;How To Create Your Own Ethereum Token In An Hour (ERC20 + Verified)&lt;br&gt;
How to do an ICO on Ethereum in less than 20 minutes.&lt;/p&gt;

&lt;p&gt;Referências:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=o7xoy0gbHO8"&gt;https://www.youtube.com/watch?v=o7xoy0gbHO8&lt;/a&gt;&lt;br&gt;
&lt;a href="https://gist.github.com/Filip3Dev/9d32f54f35719f3b748c36ba75a4833a"&gt;https://gist.github.com/Filip3Dev/9d32f54f35719f3b748c36ba75a4833a&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://remix.ethereum.org/"&gt;http://remix.ethereum.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ethereum.github.io/browser-solidity"&gt;https://ethereum.github.io/browser-solidity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://faucet.metamask.io/"&gt;https://faucet.metamask.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tUmUjZRy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0a0svh2zwlfdh36dyr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tUmUjZRy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0a0svh2zwlfdh36dyr3.png" alt="Image description" width="880" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Java Script-AdonisJs Funções(roles) ACL-RBAC Backend API</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sat, 27 Aug 2022 15:32:20 +0000</pubDate>
      <link>https://dev.to/guillerbr/java-script-adonisjs-funcoesroles-acl-rbac-backend-api-19lg</link>
      <guid>https://dev.to/guillerbr/java-script-adonisjs-funcoesroles-acl-rbac-backend-api-19lg</guid>
      <description>&lt;p&gt;Conhecimentos necessários:  NodeJs,AdonisJs Yarn/Npm, DataBase, Mysql ou PostgreeSql, JavaScript. &lt;/p&gt;

&lt;p&gt;Nesse tutorial vou ensinar a implementar um sistema de acessos filtrados, onde somente usuários autenticados e autorizados podem acessar determinadas URLs.&lt;/p&gt;

&lt;p&gt;Um sistema de nível de acesso e acesso por função completo, usando Java Script juntamente com o Framework AdonisJS para exemplificar o propósito.&lt;/p&gt;

&lt;p&gt;Usando um banco de dados relacional SQL, cliente Postgree, Mysql.&lt;br&gt;
É importante sabermos que o banco de dados relacional SQL DB é a ferramenta fundamental para esse processo, isso irá gerar uma facilidade em nosso desenvolvimento, quando começarmos a entender os relacionamentos entre as tabelas do banco e as regras de funções, que dirão quem pode fazer o que, dentro do sistema.&lt;/p&gt;

&lt;p&gt;Esse é um dos campos da programação bastante notável e usual nos sistemas de grande porte.&lt;/p&gt;

&lt;p&gt;Começando: Crie um banco de dados usando seu cliente Mysql ou Postgre. Com nome,senha e host. (não vou entrar no mérito de como fazer é necessário ter esse conhecimento).&lt;/p&gt;

&lt;p&gt;Agora depois de termos o Adonisjs instalado em nossa máquina,devemos criar o projeto.&lt;/p&gt;

&lt;p&gt;Doc Adonisjs: &lt;a href="https://adonisjs.com/docs/4.1/installation" rel="noopener noreferrer"&gt;https://adonisjs.com/docs/4.1/installation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criando nosso projeto no modo API:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;adonis new acl-rbac-adonis-api --api-only&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Encontrei duas libs relacionadas ao Adonis que fazem o papel de RBAC/ACL:&lt;/p&gt;

&lt;p&gt;1- &lt;a href="https://www.npmjs.com/package/@rocketseat/adonis-acl" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@rocketseat/adonis-acl&lt;/a&gt;&lt;br&gt;
   &lt;a href="https://github.com/HigoRibeiro/adonis-acl" rel="noopener noreferrer"&gt;https://github.com/HigoRibeiro/adonis-acl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2- &lt;a href="https://www.npmjs.com/package/accesscontrol" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/accesscontrol&lt;/a&gt;&lt;br&gt;
   &lt;a href="https://github.com/onury/accesscontrol" rel="noopener noreferrer"&gt;https://github.com/onury/accesscontrol&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Mas por fim usarei como exemplo essa lib:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/QuantumLabsLtda/adonisjs-cerberus" rel="noopener noreferrer"&gt;https://github.com/QuantumLabsLtda/adonisjs-cerberus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode criar um midlleware na unha e fazer suas regras de níveis de acesso e níveis por funções.&lt;br&gt;
Isso te dará uma melhor liberdade para implementar um sistema de ACL RBAC,mais estruturado e que te dê &lt;br&gt;
maior liberdade e que consuma menos recursos.&lt;/p&gt;

&lt;p&gt;Pois ao criar um midlleware você não precisa gastar tempo e processamento de máquina para ir&lt;br&gt;
até o banco de dados verificar se aquele usuário tem acesso aquela URL.&lt;br&gt;
De uma forma geral isso lhe custará menos tempo e processamento.Mas pode ser algo que tenha&lt;br&gt;
uma segurança menor, isso vai depender de do projeto e das variáveis em si.&lt;/p&gt;

&lt;p&gt;Criando esse midlleware você consegue facilmente separar quem pode acessar qual URL.E no geral não precisa usar um nova biblioteca somente para esse fim.&lt;/p&gt;

&lt;p&gt;No final pode ser bem mais vantajoso criar um sistema de midlleware único e criar suas próprias regras de acesso.&lt;br&gt;
Isso deve ser decidido por você e depende muito do seu tipo de projeto.&lt;/p&gt;

&lt;p&gt;Mas nesse artigo seguiremos usando um biblioteca para isso,como disse existem algumas famosas,e &lt;br&gt;
que fazem basicamente o mesmo trabalho,mas no exemplo desse artigo usaremos o CERBERUS.&lt;/p&gt;

&lt;p&gt;Existe um tutorial no link acima, super prático, mas tentarei mastigar mais um pouco.&lt;/p&gt;

&lt;p&gt;Primeiro adicione o pacote da biblioteca Adonis-Cerberus&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i @quantumlabs/adonisjs-cerberus --save&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Faça as configurações de provedores, na raiz do projeto.&lt;/p&gt;

&lt;p&gt;Em&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;start/app.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;providers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@quantumlabs/adonisjs-cerberus/providers/CerberusProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;start/app.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aceProviders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@quantumlabs/adonisjs-cerberus/providers/CommandsProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;start/kernel.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;namedMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="nx"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cerberus/Middleware/Guard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione caracteristicas especiais trails,dentro do Model User.js&lt;/p&gt;

&lt;p&gt;Em&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;app/Models/User.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;boot &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addTrait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@provider:Cerberus/Traits/Role&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addTrait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@provider:Cerberus/Traits/Permission&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente rode o comando cerberus que criará todas as migrations com os relacionamentos ,chaves PK e FK e toda estrutura baseada em ACL e RBAC.&lt;br&gt;
Execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;adonis cerberus:init&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Entre na pasta &lt;code&gt;database/migrations&lt;/code&gt; e verá as novas tabelas criadas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk3ju460zh5m4uonr7t8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk3ju460zh5m4uonr7t8g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então rode o comando para migração das tabelas para o banco de dados.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;adonis migration:run&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs35eoy398zwm72bv29n4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs35eoy398zwm72bv29n4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se tudo der certo, você verá as tabelas criadas no seu cliente de banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fywsqgd4l8yql29zc5sga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fywsqgd4l8yql29zc5sga.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como mencionado antes, este comando deve (e esperamos que vá) copiar todas as migrações específicas da biblioteca para a pasta &lt;code&gt;migrations&lt;/code&gt; de seus projetos. Não há sinalizadores ou parâmetros especiais para este comando.&lt;/p&gt;

&lt;h4&gt;
  
  
  Role / Função
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adonis cerberus:role &lt;span class="o"&gt;[&lt;/span&gt;name] &lt;span class="o"&gt;[&lt;/span&gt;slug]

Usage:
  cerberus:role &amp;lt;name&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;slug] &lt;span class="o"&gt;[&lt;/span&gt;options]

Arguments:
  name   Name of the role
  slug   Short name &lt;span class="k"&gt;for &lt;/span&gt;role
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rodando então o comando para criação de uma role/função.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
adonis cerberus:role admin adm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F58zi71ajgtedbdhbmu25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F58zi71ajgtedbdhbmu25.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na tabela &lt;em&gt;roles&lt;/em&gt; é criada um novo tipo de função para um usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7wrfzai4nxk03jogz083.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7wrfzai4nxk03jogz083.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este comando cria uma nova * role / função * na tabela de roles/funções. Você só precisa especificar a função &lt;code&gt;nome&lt;/code&gt;, o argumento&lt;code&gt;slug&lt;/code&gt; é opcional.&lt;br&gt;
This command creates a new role into roles table. You only need to specify role's name, slug argument is optional.&lt;/p&gt;

&lt;p&gt;Esse processo de criação de níveis de acesso por função continua em outras tabelas principais,&lt;strong&gt;roles&lt;/strong&gt;,&lt;strong&gt;resources&lt;/strong&gt;,&lt;strong&gt;permissions&lt;/strong&gt;,&lt;strong&gt;default_permissions&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Resource / Recurso
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adonis cerberus:resource &lt;span class="o"&gt;[&lt;/span&gt;name] &lt;span class="o"&gt;[&lt;/span&gt;slug] &lt;span class="o"&gt;[&lt;/span&gt;options]

Arguments:
  name               Name of the resource
  slug               Short name &lt;span class="k"&gt;for &lt;/span&gt;resource

Options:
  &lt;span class="nt"&gt;-p&lt;/span&gt;, &lt;span class="nt"&gt;--defaultPermission&lt;/span&gt;   Generate default permissions
  &lt;span class="nt"&gt;-a&lt;/span&gt;, &lt;span class="nt"&gt;--always-ask&lt;/span&gt;   Ask which rights give &lt;span class="k"&gt;in &lt;/span&gt;each Resource once &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;false &lt;/span&gt;by default&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;--from-models&lt;/span&gt;      Generate a resource &lt;span class="k"&gt;for &lt;/span&gt;each app Model
  &lt;span class="nt"&gt;--from-controllers&lt;/span&gt; Generate a resource &lt;span class="k"&gt;for &lt;/span&gt;each app Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Rodando então o comando para criação de uma resource/recurso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
adonis cerberus:resource admin adm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0j0ii9x1jjevavvdehde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0j0ii9x1jjevavvdehde.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na tabela &lt;em&gt;resource&lt;/em&gt; é criada um novo tipo de função para um usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmx01e692s0bjjsfgkoac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmx01e692s0bjjsfgkoac.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este comando cria um novo * resource / recurso * na tabela de recursos. Você só precisa especificar o &lt;code&gt;nome&lt;/code&gt; do recurso, o argumento&lt;code&gt;slug&lt;/code&gt; é opcional.&lt;br&gt;
The options are:&lt;br&gt;
  &lt;code&gt;-p, --defaultPermission&lt;/code&gt; - Generate default permissions&lt;br&gt;
  &lt;code&gt;-a, --always-ask&lt;/code&gt; - Ask which rights give in each Resource once (false by default)&lt;br&gt;
  &lt;code&gt;--from-models&lt;/code&gt; - Generate a resource for each app Model&lt;br&gt;
  &lt;code&gt;--from-controllers&lt;/code&gt; - Generate a resource for each app Controller&lt;/p&gt;
&lt;h4&gt;
  
  
  Default Permission / Permissão Padrão
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cerberus:defaultPermission &lt;span class="o"&gt;[&lt;/span&gt;options]

Options:
  &lt;span class="nt"&gt;-a&lt;/span&gt;, &lt;span class="nt"&gt;--all&lt;/span&gt;               Run default permission creation &lt;span class="k"&gt;for &lt;/span&gt;each Resource &lt;span class="k"&gt;in &lt;/span&gt;database
  &lt;span class="nt"&gt;--resource-name&lt;/span&gt; &amp;lt;value&amp;gt; Name of resource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Rodando então o comando para criação de uma default_permissions/padrão de permissões.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
adonis cerberus:defaultPermission &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjfu41a72ozjqu092m79h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjfu41a72ozjqu092m79h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8gqtdvicn5jnyxwpvi2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8gqtdvicn5jnyxwpvi2g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtfq7kwcpm1a0kf28a6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjtfq7kwcpm1a0kf28a6q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este comando cria uma nova * permissão padrão * na tabela default_permissions. Você precisa especificar um nome de Recurso e, em seguida, * Cerberus * cria um registro de permissão padrão com o Recurso * nome * especificado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uso
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Uso em rotas
&lt;/h2&gt;

&lt;p&gt;Depois de criar suas &lt;em&gt;Permissions&lt;/em&gt;, você poderá começar a usar o middleware &lt;strong&gt;Guard&lt;/strong&gt; em suas rotas.&lt;/p&gt;

&lt;p&gt;É simples vincular uma permissão a uma rota, veja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
* Get all users
* GET users
*/&lt;/span&gt;
&lt;span class="nx"&gt;Route&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserController.index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guard: user.read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode usar várias permissões em sua rota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
* Create a new user
* POST users/register
*/&lt;/span&gt;
&lt;span class="nx"&gt;Route&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;register&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserController.register&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guard: user.create, user.read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E também é possível usar vários recursos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
* Fetch all posts with user profile
* GET posts
*/&lt;/span&gt;
&lt;span class="nx"&gt;Route&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PostController.index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guard: post.read, user.read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Aviso &lt;em&gt;: Você precisa adicionar o middleware &lt;code&gt;auth&lt;/code&gt; padrão *&lt;/em&gt; antes de ** Cerberus&lt;code&gt;guard&lt;/code&gt;!
&lt;em&gt;Warning&lt;/em&gt;: You need to add the default &lt;code&gt;auth&lt;/code&gt; middleware &lt;strong&gt;before&lt;/strong&gt; Cerberus &lt;code&gt;guard&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Consuming Models
&lt;/h3&gt;

&lt;p&gt;You &lt;strong&gt;should&lt;/strong&gt; use Cerberus Models to create &lt;em&gt;Roles&lt;/em&gt;, &lt;em&gt;Resources&lt;/em&gt; and &lt;em&gt;Permissions&lt;/em&gt; in your own code. It's also useful for creating seeds or a complete CRUD to manage your Cerberus stuff. It's simple to use:&lt;/p&gt;

&lt;h4&gt;
  
  
  Roles
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cerberus/Models/Role&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Creating a new Role&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jedi Master&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jedi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="c1"&gt;// or&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wookie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wookie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="c1"&gt;// You can use any Lucid methods you want&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Mapear e Filtrar dados de uma API com ReactJS e Java Script!</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sat, 27 Aug 2022 15:31:13 +0000</pubDate>
      <link>https://dev.to/guillerbr/mapear-e-filtrar-dados-de-uma-api-com-reactjs-e-java-script-11m4</link>
      <guid>https://dev.to/guillerbr/mapear-e-filtrar-dados-de-uma-api-com-reactjs-e-java-script-11m4</guid>
      <description>&lt;p&gt;Ao final desse artigo seremos capazes de entender todo funcionamento, além de aplicar conhecimento relacionado: &lt;/p&gt;

&lt;p&gt;1-Receber dados &lt;strong&gt;Objetos e Arrays em Json&lt;/strong&gt; uma API.&lt;/p&gt;

&lt;p&gt;2-Imprimir os resultados dos dados em uma lista ordenada.&lt;/p&gt;

&lt;p&gt;3-Além disso criaremos um motor de busca com o &lt;strong&gt;filter&lt;/strong&gt;,uma função do Java Script.Isso permitirá buscar determinadas informações da API/lista de dados.&lt;/p&gt;

&lt;p&gt;Recentemente tive um desafio de pegar os dados de uma API,filtrar,criar uma busca e imprimir em uma página web,usando ReactJS.&lt;/p&gt;

&lt;p&gt;O ReactJS é um Biblioteca Java Script para cliente Frontend.&lt;/p&gt;

&lt;p&gt;Para isso teremos que usar funções nativas do java script.Funções que nos permitirão fazer,ordenação, manipulação de objetos em Arrays,objetos JSON,em diferentes formatações de objeto.&lt;/p&gt;

&lt;p&gt;Referência da API em JSON que vamos usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;note que ela tem um &lt;em&gt;array com objetos aninhados em json&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jsonplaceholder.typicode.com/users" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/users&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usaremos essa API para aplicar o tratamento, mapeamento e filtragem dos dados de resposta da API.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Os dados de resposta em &lt;em&gt;json&lt;/em&gt; podem vir de diversas formas como &lt;strong&gt;objetos e arrays&lt;/strong&gt; cada uma terá uma forma diferente de tratamento no React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jsonplaceholder.typicode.com/" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Função Map do Java Script:&lt;/p&gt;

&lt;p&gt;O objeto Map é um mapa simples de chave/valor. Qualquer valor (objeto e valores primitivos) pode ser usado como uma chave ou um valor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Função Filter do Java Script:&lt;/p&gt;

&lt;p&gt;O método filter() cria um novo array com todos os elementos que passaram no teste implementado pela função fornecida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Projeto usando o map ew filter para ler e buscar os dados da API do nosso link/url.Projeto aberto no &lt;em&gt;Codesandbox&lt;/em&gt; service:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/react-map-list-api-data-2021-i7jbf?file=/src/App.js" rel="noopener noreferrer"&gt;https://codesandbox.io/s/react-map-list-api-data-2021-i7jbf?file=/src/App.js&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Existem diversos tipos de objetos json que retornam das APIS:
&lt;/h2&gt;

&lt;p&gt;O mais comum é um array composto de objetos, &lt;em&gt;mais usado em casos específicos&lt;/em&gt;:&lt;/p&gt;

&lt;h5&gt;
  
  
  Existem outras formas de retorno de dados da api, isso depende da opção de quem desenvolveu a mesma.
&lt;/h5&gt;

&lt;p&gt;A diferença entre esses vários objetos faz com que devamos usar uma forma de código para casa caso.Note que os objetos são diferentes,assim devemos indexar e tratar cada tipo de encapsulamento de objetos JSON como únicos.&lt;br&gt;
Analisando e aplicando as funções e regras corretas,conseguiremos imprimir,buscar e manipular os dados do objeto.&lt;/p&gt;

&lt;p&gt;Algumas funções JS que podem ser usados no ReactJS:&lt;/p&gt;

&lt;p&gt;Object.values:&lt;br&gt;
O método Object.keys() retorna um array de propriedades enumeraveis de um determinado objeto, na mesma ordem em que é fornecida por um laço for...in (a diferença é que um laço for-in  enumera propriedades que estejam na cadeia de protótipos).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Object.keys:&lt;br&gt;
O método Object.keys() retorna um array de propriedades enumeráveis de um determinado objeto, na mesma ordem em que é fornecida por um laço for...in (a diferença é que um laço for-in  enumera propriedades que estejam na cadeia de protótipos).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conceitos e montagem do ciclo de vida no ReactJS.
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Conhecimento em ReactJS , Class e Hooks:
&lt;/h3&gt;

&lt;p&gt;Para trazer os dados corretamente na tela do usuário devemos&lt;br&gt;
usar os conceitos de Component,Stateful/Stateless, Props,State,setState(),ComponentDidMount,ComponentWillReceiveProps,Arrow Functions,Funções de onClick,Funções Anônimas,Funções de Evento handleChange(e), { entre outras técnicas e funções.&lt;br&gt;
Depois iremos renderizar os dados na tela.&lt;/p&gt;

&lt;p&gt;É muito importante sabermos o id ou indexador do item que queremos buscar,assim será mais fácil escolher qual tipo de sintaxe usar,mas tudo estará em volta dos conceitos de:&lt;/p&gt;

&lt;h3&gt;
  
  
  Mapear
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="c1"&gt;//import React, { useEffect, useState } from "react";&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Filter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Filter.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
  &lt;span class="c1"&gt;//const [id, setId] = React.useState([]);&lt;/span&gt;&lt;br&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="c1"&gt;// getAllUser();&lt;/span&gt;&lt;br&gt;
    &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&lt;a href="https://jsonplaceholder.typicode.com/users" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/users&lt;/a&gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;my_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;my_user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
    &lt;span class="nf"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;my_user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;&lt;br&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;MAP&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="nx"&gt;objeto&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Wellcome&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;item.id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;        &lt;span class="p"&gt;))}&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Filtrar&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;//import React from "react";&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;//FILTER SEARCH DATA API&lt;/span&gt;&lt;br&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;&lt;br&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;searchFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSearchFilter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;&lt;br&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setResult&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&lt;a href="https://jsonplaceholder.typicode.com/users" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/users&lt;/a&gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSearchFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;br&gt;
      &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
    &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&lt;br&gt;
  &lt;span class="c1"&gt;//console.log(data);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nf"&gt;setResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Filter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;FILTER&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Wellcome&lt;/span&gt; &lt;span class="nx"&gt;Search&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Search&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Appfilter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;br&gt;
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search here ... &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
          &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
        &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;        &lt;span class="p"&gt;))}&lt;/span&gt;&lt;br&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;br&gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Projeto Online&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i7jbf.csb.app/" rel="noopener noreferrer"&gt;https://i7jbf.csb.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmwqy9j289sets4ha3m5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmwqy9j289sets4ha3m5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  EM CONSTRUÇÃO
&lt;/h3&gt;

&lt;p&gt;Exemplos:&lt;/p&gt;

&lt;p&gt;Exemplos CodePen-CodeSandBox:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/Guillerbr/pen/oNjgpod" rel="noopener noreferrer"&gt;https://codepen.io/Guillerbr/pen/oNjgpod&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/filter-react-search-function-api-data-gxtqk" rel="noopener noreferrer"&gt;https://codesandbox.io/s/filter-react-search-function-api-data-gxtqk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fontes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@programadriano/javascript-entendendo-a-diferen%C3%A7a-entre-map-x-foreach-366a77fc7e82" rel="noopener noreferrer"&gt;https://medium.com/@programadriano/javascript-entendendo-a-diferen%C3%A7a-entre-map-x-foreach-366a77fc7e82&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@programadriano/javascript-conhecendo-map-filter-e-reduce-ce072d8f0ec5" rel="noopener noreferrer"&gt;https://medium.com/@programadriano/javascript-conhecendo-map-filter-e-reduce-ce072d8f0ec5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@marcellguilherme/aprenda-tudo-sobre-reduce-ou-fold-fd71de86ce53" rel="noopener noreferrer"&gt;https://medium.com/@marcellguilherme/aprenda-tudo-sobre-reduce-ou-fold-fd71de86ce53&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/iam_timsmith/lets-build-a-search-bar-in-react-120j"&gt;https://dev.to/iam_timsmith/lets-build-a-search-bar-in-react-120j&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://desenvolvimentoparaweb.com/javascript/map-filter-reduce-javascript/" rel="noopener noreferrer"&gt;https://desenvolvimentoparaweb.com/javascript/map-filter-reduce-javascript/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/jsref/" rel="noopener noreferrer"&gt;https://www.w3schools.com/jsref/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>api</category>
      <category>map</category>
    </item>
    <item>
      <title>Authentication Cookies HTTP, HTTP Only, JWT, ReactJs Context API and Node on Backend Industry Structure</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Mon, 14 Mar 2022 00:38:52 +0000</pubDate>
      <link>https://dev.to/guillerbr/authentication-cookies-http-http-only-jwt-reactjs-context-api-and-node-on-backend-industry-structure-3f8e</link>
      <guid>https://dev.to/guillerbr/authentication-cookies-http-http-only-jwt-reactjs-context-api-and-node-on-backend-industry-structure-3f8e</guid>
      <description>&lt;h1&gt;
  
  
  Useful for you, consider buying me a coffee. Thanks!
&lt;/h1&gt;

&lt;p&gt;ETH:&lt;br&gt;
0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcoinqrcodemaker.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bitcoinqrcodemaker.com%2Fapi%2F%3Fstyle%3Dethereum%26address%3D0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc" alt="Ethereum QR Code Generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;The purpose of this article is to present, discuss, and provide specific mitigation techniques on user authentication and session best practices using &lt;em&gt;Cookies, Http Only, JWT, Session, LocalStorage, and other methods.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Http cookies
&lt;/h2&gt;

&lt;p&gt;An HTTP cookie (a web cookie or browser cookie) is a small piece of data that a server sends to a user's browser. The browser can store this data and send it back on the next request to the same server. It is usually used to identify whether two requests came from the same browser — when keeping a user logged in, for example. It stores dynamic information for the stateless HTTP protocol.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cookies are mainly used for three purposes:
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Session Management:
&lt;/h5&gt;

&lt;p&gt;Logins, shopping carts, game scores or any other activity that must be kept by a server.&lt;/p&gt;

&lt;h5&gt;
  
  
  Customization:
&lt;/h5&gt;

&lt;p&gt;User preferences, themes and other settings.&lt;/p&gt;

&lt;h5&gt;
  
  
  Tracking:
&lt;/h5&gt;

&lt;p&gt;Recording and analyzing a user's behavior.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We can set the expiration time for each cookie&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The 4K limit is for the entire cookie, including name, value, expiration date, etc. To support most browsers, keep the name below 4000 bytes and the overall cookie size below 4093 bytes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data is sent back to the server for each HTTP request (HTML, images, JavaScript, CSS, etc) — increasing the amount of traffic between the client and the server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Http Only
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqh0wmupnkvrq8vp8ig8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqh0wmupnkvrq8vp8ig8.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is HttpOnly?
&lt;/h4&gt;

&lt;p&gt;According to the Microsoft Developer Network, HttpOnly is an additional flag included in an HTTP Set-Cookie response header. Using the HttpOnly flag when generating a cookie helps mitigate the risk of client-side script accessing the protected cookie (if the browser supports it).&lt;/p&gt;

&lt;p&gt;To prevent cross-site scripting (XSS) attacks, &lt;em&gt;HttpOnly&lt;/em&gt; cookies are inaccessible to the Document.cookie JavaScript API (en-US); they are sent only to the server. For example, cookies that persist server sessions do not need to be available to JavaScript, so the &lt;em&gt;HttpOnly&lt;/em&gt; directive must be set.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

_Set-Cookie: &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a3fWa&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;Expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Wed, 21 Oct 2015 07:28:00 GMT&lt;span class="p"&gt;;&lt;/span&gt; Secure&lt;span class="p"&gt;;&lt;/span&gt; HttpOnly_


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A &lt;em&gt;HttpOnly&lt;/em&gt; cookie is a tag added to a browser cookie that prevents client-side scripts from accessing the data. It provides a port that prevents the specialized cookie from being accessed by anything other than the server. Using the HttpOnly tag when generating a cookie helps reduce the risk of client-side scripts accessing the protected cookie, making those cookies more secure.&lt;/p&gt;

&lt;h5&gt;
  
  
  The example below shows the syntax used in the HTTP response header:
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

Set-Cookie: &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“[&lt;span class="p"&gt;;&lt;/span&gt; “&lt;span class="o"&gt;=&lt;/span&gt;“]&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“][&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“]&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“][&lt;span class="p"&gt;;&lt;/span&gt; secure][&lt;span class="p"&gt;;&lt;/span&gt; HttpOnly]&lt;span class="sb"&gt;`&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the &lt;strong&gt;HttpOnly flag is included in the HTTP response header, the cookie cannot be accessed via client-side script.&lt;/strong&gt; As a result, even if there is a cross-site scripting (XSS) failure and a user accesses accidentally a link that exploits the flaw, the browser will not reveal the cookie to third parties.&lt;/p&gt;

&lt;p&gt;Here's an example - let's say a browser detects a cookie containing the &lt;em&gt;HttpOnly&lt;/em&gt; flag. If client-side code tries to read the cookie, the browser will return an empty string as a result. This helps &lt;em&gt;prevent malicious code (usually cross-site scripting (XSS))&lt;/em&gt; from sending data to an attacker's website.&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpz9k516q6cxhps8xo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpz9k516q6cxhps8xo0.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  User authentication using the mechanism called JWT (JSON Web Token)
&lt;/h4&gt;

&lt;p&gt;Authentication strategy for simple and secure REST APIs. It is an open standard for web authentication and is based entirely on JSON requests between the client and server. Its authentication mechanism works as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The client makes a one-time request when sending the login and password credentials;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server validates the credentials and, if everything is correct, it returns to the client a JSON with a token that encodes data from a user logged into the system;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After receiving the token, the client can store it in the way they prefer, either by LocalStorage, SessionStorage, Cookies and HTTP Only or other client-side storage mechanisms;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every time the client accesses a route that requires authentication, it just sends this token to the API to authenticate and release the consumption data;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server always validates this token to allow or block a client request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  JWT (JSON Web Token) is an industry-standard RCT 7519 method for performing authentication between two parties via a signed token that authenticates a web request. This token is a Base64 code that stores JSON objects with the data s that allow authentication of the request.
&lt;/h6&gt;

&lt;p&gt;With a secure &lt;em&gt;token&lt;/em&gt; built in, it is mathematically impossible to decode the signature without having the application's key secret. However, once in possession of the secret, any application can decode the signature and verify that it is valid. This is done by generating a &lt;em&gt;signature&lt;/em&gt; using the header and &lt;em&gt;payload&lt;/em&gt; provided by the client, and then we compare this &lt;em&gt;signature&lt;/em&gt; generated with the one present in the &lt;em&gt;token&lt;/em&gt; sent by the client. Once the signatures are identical, we can allow the client access to a restricted area of ​​our application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jwt.io/" rel="noopener noreferrer"&gt;https://jwt.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SessionStorage and LocalStorage
&lt;/h2&gt;

&lt;h4&gt;
  
  
  SessionStorage
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;sessionStorage&lt;/strong&gt; is similar to localStorage , the only difference is that while the data stored in &lt;strong&gt;localStorage does not expire, the data in sessionstorage has its data cleared when the page session expires.&lt;/strong&gt; The page session it lasts while the browser is open and keeps on reloading the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web storage can be simplistically seen as an improvement over cookies, offering much greater storage capacity. The available size is 5MB, which is considerably more space to work with than a typical 4KB cookie.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data is not sent back to the server for each HTTP request (HTML, images, JavaScript, CSS, etc) — reducing the amount of traffic between the client and the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data stored in localStorage persists until explicitly deleted. Changes made are saved and available for all current and future visits to the site.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works on same-origin policy. Therefore, stored data will only be available from the same source.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  LocalStorage
&lt;/h4&gt;

&lt;p&gt;Use &lt;em&gt;localStorage&lt;/em&gt; to store temporary variables.&lt;/p&gt;

&lt;p&gt;It is similar to localStorage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Changes are only available per window (or in browsers like Chrome and Firefox). Changes made are saved and made available for the current page as well as future visits to the site in the same window. Once the window is closed, the storage is deleted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data is only available within the window/tab in which it was defined.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data is not persistent, i.e. it will be lost when the window/tab is closed. Like localStorage, it works on the same origin policy. Therefore, stored data will only be available from the same source.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Local and Session Storage Considerations
&lt;/h5&gt;

&lt;p&gt;Both &lt;em&gt;localStorage and sessionStorage&lt;/em&gt; extend from &lt;em&gt;Storage&lt;/em&gt;. There is no difference between them, except for the non-persistence of &lt;em&gt;sessionStorage&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The non-persistence as described above is in the sense that &lt;em&gt;sessionStorage&lt;/em&gt; is only available for the window that created the data until that window is closed, when opening another window (or tab) such data will not be available.&lt;/p&gt;

&lt;p&gt;In contrast to &lt;em&gt;sessionStorage&lt;/em&gt;, when creating data in &lt;em&gt;localStorage&lt;/em&gt; this data will be available for any tab/window even if the user closes the window, restarts the system, etc.&lt;/p&gt;

&lt;p&gt;For example, assuming you want to save the username and password to log in, you might choose to store this data in sessionStorage for security reasons and save the user settings in localStorage.&lt;/p&gt;

&lt;h1&gt;
  
  
  Real World Application
&lt;/h1&gt;

&lt;p&gt;Store a user token. In this step, you will store the user token. You will implement different &lt;em&gt;token&lt;/em&gt; storage options and learn the security implications of each approach. Finally, you'll learn how different approaches will change the user experience as they open new tabs or close a session.&lt;/p&gt;

&lt;p&gt;At the end of this step, you can choose a storage approach based on your application's goals.&lt;/p&gt;

&lt;p&gt;There are several options for storing &lt;em&gt;tokens&lt;/em&gt;. Each option has costs and benefits. Briefly, the options are: store in memory &lt;em&gt;JavaScript&lt;/em&gt;, store &lt;em&gt;sessionStorage&lt;/em&gt;, store &lt;em&gt;localStorage&lt;/em&gt; and store in a cookie. The main tradeoff is security. Any information stored outside of the current application's memory is &lt;em&gt;vulnerable to Cross-Site Scripting (XSS)&lt;/em&gt; attacks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The danger is that if a malicious user is able to load code into your application, they can access localStorage, sessionStorage, and any cookies that are also accessible to your application&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The benefit of memoryless storage methods is that you can reduce the number of times a user will need to log in to create a better user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  This tutorial will cover &lt;em&gt;sessionStorage, localStorage, Cookies and HTTP Only&lt;/em&gt; as these are more modern.
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Session Storage
To test the benefits of out-of-memory storage, convert in-memory storage to &lt;em&gt;sessionStorage&lt;/em&gt;. Open App.js:&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Using ReactJs frontend client for user interfaces.
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;You must have basic and intermediate knowledge about &lt;em&gt;ReactJs&lt;/em&gt; for cunderstand more easily the deployment of a &lt;em&gt;secure&lt;/em&gt; and &lt;em&gt;modern&lt;/em&gt; authentication service, widely recommended and used by the &lt;em&gt;open source community&lt;/em&gt; to authenticate a user to a web system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the vulnerabilities?
&lt;/h2&gt;

&lt;p&gt;Both methods come with potential related security issues:&lt;/p&gt;

&lt;h2&gt;
  
  
  Vulnerability Method
&lt;/h2&gt;

&lt;p&gt;XSS local storage - cross-site scripting&lt;br&gt;
CSRF Cookies - Cross-Site Request Forgery&lt;/p&gt;

&lt;p&gt;An XSS vulnerability allows an attacker to inject JavaScript into a website.&lt;br&gt;
A CSRF vulnerability allows an attacker to take actions on a website through an authenticated user.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I get around this?
&lt;/h2&gt;

&lt;p&gt;If local storage can be exploited by third-party scripts (such as those found in browser extensions) and if authentication can be spoofed with cookies, where is it acceptable to put client state?&lt;/p&gt;

&lt;p&gt;In single page app authentication using cookies in Auth0 docs, we learned that if your app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is served to the customer using its own backend&lt;/li&gt;
&lt;li&gt;Has the same domain as your backend&lt;/li&gt;
&lt;li&gt;Makes API calls that require authentication to your backend&lt;/li&gt;
&lt;li&gt;So there is a way to use cookies for authentication securely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  UNDER DEVELOPMENT AND CONSTRUCTION
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Links and References:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://owasp.org/www-community/HttpOnly" rel="noopener noreferrer"&gt;https://owasp.org/www-community/HttpOnly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@ryanchenkie_40935/react-authentication-how-to-store-jwt-in-a-cookie-346519310e81" rel="noopener noreferrer"&gt;https://medium.com/@ryanchenkie_40935/react-authentication-how-to-store-jwt-in-a-cookie-346519310e81&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Cookies" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Cookies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Window/sessionStorage" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/Window/sessionStorage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.taniarascia.com/full-stack-cookies-localstorage-react-express/" rel="noopener noreferrer"&gt;https://www.taniarascia.com/full-stack-cookies-localstorage-react-express/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>authentication</category>
      <category>security</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Deploy ReactJS on Firebase Hosting</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Mon, 14 Mar 2022 00:20:11 +0000</pubDate>
      <link>https://dev.to/guillerbr/deploy-reactjs-on-firebase-hosting-4mpj</link>
      <guid>https://dev.to/guillerbr/deploy-reactjs-on-firebase-hosting-4mpj</guid>
      <description>&lt;h1&gt;
  
  
  Useful for you, consider buying me a coffee. Thanks!
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Please if this is useful and helps in your purpose, consider offering me a coffee, thank you, so we can evolve together!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ETH:&lt;br&gt;
0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcoinqrcodemaker.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bitcoinqrcodemaker.com%2Fapi%2F%3Fstyle%3Dethereum%26address%3D0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc" alt="Ethereum QR Code Generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First we need you to have knowledge in &lt;strong&gt;React, NodeJS, Java Script, GIT, FRONTEND, Deploy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;https://console.firebase.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal7ut5behlrybyjsbowz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal7ut5behlrybyjsbowz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft7lz2mm79bon5j78m5fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft7lz2mm79bon5j78m5fo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new project with the name. Okay, now that we have the project created we can use several &lt;strong&gt;Firebase&lt;/strong&gt; tools, one of them is &lt;strong&gt;Hosting&lt;/strong&gt;, but feel free to use others, in this article we will only deal with hosting.&lt;/p&gt;

&lt;p&gt;In the Firebase dashboard click on &lt;strong&gt;Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgmjd2qfth5dbfok6d6ya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgmjd2qfth5dbfok6d6ya.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need a &lt;strong&gt;React&lt;/strong&gt; frontend project already ready, and then we will build this project on firebase hosting, we will also use the domain provided by them, but of course we can change it in the future.&lt;/p&gt;

&lt;p&gt;You will need to have the &lt;strong&gt;Firebase&lt;/strong&gt; dependency package for the &lt;strong&gt;Node js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the &lt;strong&gt;firebase-tools&lt;/strong&gt; package globally, this package will be installed on your computer and not in the project itself. This firebase utility will help us to run commands and connect that project we created in the firebase hosting.&lt;br&gt;
Run the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g firebase-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go to the console shell, inside the &lt;em&gt;React&lt;/em&gt; project folder&lt;/p&gt;

&lt;p&gt;I'll use this React project as an example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/guillerbr/ghd-sites" rel="noopener noreferrer"&gt;https://github.com/guillerbr/ghd-sites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clone the project and enter the folder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Furqsuz19egvc6ganer85.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Furqsuz19egvc6ganer85.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install the application, packages and dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the root of your React project, type the command to build (build).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run-script build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  or:
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;strong&gt;npm&lt;/strong&gt; creates the static files already transpiled and configured to be lightweight files. After running the command it will create a &lt;strong&gt;build&lt;/strong&gt; folder where the files we need will be.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgutrt16chz4mx5yanq70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgutrt16chz4mx5yanq70.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frj7fyzrntjqa01o2uglq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frj7fyzrntjqa01o2uglq.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to link our React application to our Firebase Hosting services. For this we will use the &lt;strong&gt;firebase-tools&lt;/strong&gt; that we installed at the beginning.&lt;br&gt;
Type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to be authenticated to Google Firebase account with your browser, after the above command Google may ask for some verification to link your application in shell console, your Firebase account in browser. If Google opens the Browser and asks for account authentication. Accept and complete the operation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb42x44uteveg1obp0ddq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb42x44uteveg1obp0ddq.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ready! The console says I'm authenticated and gives my &lt;em&gt;email&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Inside the project root, let's type the commands for final configurations.&lt;br&gt;
Type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accept the confirmation, and you will have these options in the console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6juhl4ninpt00gnukif2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6juhl4ninpt00gnukif2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hosting: Configure files for Firebase Hosting and (optionally) set up Guithub Action deploys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we will have the new configuration step:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7h25svr9g8nsy1pvwu7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7h25svr9g8nsy1pvwu7i.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use an existing project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A list of projects and their names will appear. Now we need to choose the name of the project we created in firebase. Mine is &lt;strong&gt;ghdsites2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs8c3hvbvwh45nh05yish.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs8c3hvbvwh45nh05yish.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we will drop into the public directory configuration part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z9n7jos2ms9v7jwhgps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z9n7jos2ms9v7jwhgps.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This question will appear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Configure as a single-page app (rewrite all urls to /index.html)? (y/n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This question will appear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File build/index.html already exists. Overwrite? (y/n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3ev4meprhtbvzokk7ldw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3ev4meprhtbvzokk7ldw.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we will go to the final part of construction.&lt;br&gt;
Type the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcq9mnojalpkgu6h98au9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcq9mnojalpkgu6h98au9.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;READY!&lt;br&gt;
FINALLY!&lt;/p&gt;

&lt;p&gt;After doing all these procedures, the firebase console will inform you that the process was completed successfully and your application is already hosted with a domain and ready to be accessed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1qx3pbxd3oeubkfjdvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1qx3pbxd3oeubkfjdvh.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobq3kq3h7jjkgjnui2oq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobq3kq3h7jjkgjnui2oq.png" alt="Alt ​​Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploy API Node, Adonis, Mysql AWS Ubuntu</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sat, 03 Jul 2021 00:44:08 +0000</pubDate>
      <link>https://dev.to/guillerbr/deploy-api-node-adonis-mysql-aws-ubuntu-4549</link>
      <guid>https://dev.to/guillerbr/deploy-api-node-adonis-mysql-aws-ubuntu-4549</guid>
      <description>&lt;h1&gt;
  
  
  Deploy de produção completo API Node/Adonis, Mysql, Ubuntu 18/20 no servidor cloud AWS.
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Criar uma máquina no serviço ec2 da Aws. Ubuntu Server 18.04 ou 20
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Instalar o Nodejs na versão 14 TLS
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://deb.nodesource.com/setup_14.x | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Verifique a instalação e versão.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node  &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  A versão deve ser igual ou superior a 14.17
&lt;/h5&gt;

&lt;p&gt;-Versão do Nodejs instalada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;v14.17.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Verifique o NPM e sua versão:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Instalar o Adonis Framework Global&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Instalar o Mysql-Server
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Comando de instalação:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;mysql-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Instalando da forma correta e segura siga esse exemplo:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-pt" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-pt&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Verifique se o Mysql foi instalado corretamente e se esta funcionando.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status mysql.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Se tudo estiver certo, o resultado será esse:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7s21t7shpvleniqc6m9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7s21t7shpvleniqc6m9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agora vamos trocar a senha do &lt;em&gt;usuário padrão do mysql, o root&lt;/em&gt;.
&lt;/h2&gt;

&lt;p&gt;Entre no Mysql, com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora alterar/adicionar uma senha para o usuário root.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Altere 'you new password' para sua senha atual.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ALTER USER &lt;span class="s1"&gt;'root'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt; IDENTIFIED BY &lt;span class="s1"&gt;'your new password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Altere 'you new password' para sua senha atual.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ALTER USER &lt;span class="s1"&gt;'root'&lt;/span&gt;@&lt;span class="s1"&gt;'localhost'&lt;/span&gt; IDENTIFIED WITH mysql_native_password BY &lt;span class="s1"&gt;'your new password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resposta do Mysql:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query OK, 0 rows affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando um novo banco de dados para nossa aplicação:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Digite sua senha cadastrada no processo anterior.&lt;/p&gt;

&lt;h5&gt;
  
  
  Pronto! Dentro do MYSQL!
&lt;/h5&gt;

&lt;p&gt;Crie um novo banco de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE my_name_database;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Veja o novo banco criado:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHOW DATABASES;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Agora poderemos incluir o processo em nosso arquivo &lt;em&gt;.env&lt;/em&gt;, fazendo a migração do banco de dados para o nosso banco recém criado. Se tudo estiver correto poderemos fazer as migrations sem problemas.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Você pode usar outros Banco de Dados ou ORMs e coisas do tipo, você pode fazer isso usando qualquer outra ferramenta nesse sentido, neste exemplo usaremos o Node-JS com AdonisFramework-JS, por isso algumas particularidades.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Download do &lt;strong&gt;projeto API Service Backend&lt;/strong&gt;. Projeto usando Nodejs/Adonis Framework e Mysql Database.
&lt;/h5&gt;

&lt;p&gt;O projeto está aberto no Github:&lt;br&gt;
&lt;a href="https://github.com/Utwo/adonis-realworld-example-app" rel="noopener noreferrer"&gt;https://github.com/Utwo/adonis-realworld-example-app&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Criar um novo usuário Linux dentro do seu console do Ubuntu 18 ou 20. Toque &lt;em&gt;novo_usuario&lt;/em&gt; pelo seu usuário.
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser novo_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Cadastre sua senha passa esse usuário.
&lt;/h4&gt;
&lt;h2&gt;
  
  
  Como conceder a um usuário privilégios root
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/visudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Altere o arquivo, inserindo seu usuário e o total privilégio.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adicionando o nome do usuário e as mesmas permissões como root sob a especificação de privilégios do usuário irá conceder-lhes os privilégios sudo.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;privilege&lt;/span&gt; &lt;span class="nx"&gt;specification&lt;/span&gt;
&lt;span class="nx"&gt;root&lt;/span&gt;            &lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;ALL&lt;/span&gt; 
&lt;span class="nx"&gt;novo_usuario&lt;/span&gt;    &lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;ALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpzxq2agw70f8z7eqic4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpzxq2agw70f8z7eqic4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Entre na sessão desse novo usuário criado:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su - novo_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pronto! Verifique de estar logado com seu usuário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;myuser@ip-122-34-1-200:~&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instale o Adonis-Cli Framework Globalmente no servidor:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; adonis-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instale o PM2 Framework Globalmente para &lt;strong&gt;Hosting&lt;/strong&gt; e &lt;strong&gt;Deploy&lt;/strong&gt; da nossa aplicação:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Processo completo de instalação, configuração e migração do banco de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Faça o download do projeto para o local do seu usuário.
&lt;/h2&gt;

&lt;p&gt;O projeto está aberto no Github:&lt;br&gt;
&lt;a href="https://github.com/Utwo/adonis-realworld-example-app" rel="noopener noreferrer"&gt;https://github.com/Utwo/adonis-realworld-example-app&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Utwo/adonis-realworld-example-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Entre no projeto:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;adonis-realworld-example-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instale a aplicação e os pacotes:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alterar o arquivo .env.exemple para .env:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; .env.exemple .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Instale a Adonis dentro da sessão do seu usuário recém criado:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm i &lt;span class="nt"&gt;--global&lt;/span&gt; @adonisjs/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Instale o PM2 dentro da sessão do seu usuário recém criado:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Gerando a chave única da aplicação:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adonis key:generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entre no arquivo .env para configurar sua aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Altere &lt;strong&gt;suas credências de acesso ao banco de dados&lt;/strong&gt; no arquivo &lt;strong&gt;.env&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foof259dnjrle9bv8mx3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foof259dnjrle9bv8mx3b.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  EM CONSTRUÇÃO...
&lt;/h2&gt;

&lt;p&gt;Referências: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://wime.com.br/2013/06/06/como-adicionar-e-excluir-usuarios-no-ubuntu-12-04-e-centos-6/" rel="noopener noreferrer"&gt;https://wime.com.br/2013/06/06/como-adicionar-e-excluir-usuarios-no-ubuntu-12-04-e-centos-6/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/" rel="noopener noreferrer"&gt;https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/romainlanz/deploy-your-adonis-website-17ec"&gt;https://dev.to/romainlanz/deploy-your-adonis-website-17ec&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-pt" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-pt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/51008807/nodejs-mysql-client-does-not-support-authentication-protocol" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/51008807/nodejs-mysql-client-does-not-support-authentication-protocol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://scotch.io/tutorials/deploying-adonisjs-5-to-digitalocean" rel="noopener noreferrer"&gt;https://scotch.io/tutorials/deploying-adonisjs-5-to-digitalocean&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://computingforgeeks.com/install-node-js-14-on-ubuntu-debian-linux/" rel="noopener noreferrer"&gt;https://computingforgeeks.com/install-node-js-14-on-ubuntu-debian-linux/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>node</category>
      <category>aws</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Autenticação Cookies HTTP, HTTP Only, JWT, SessionStorage,LocalStorage, com ReactJs Context API e Node no Backend</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sun, 27 Jun 2021 01:48:49 +0000</pubDate>
      <link>https://dev.to/guillerbr/autenticacao-cookies-http-http-only-jwt-sessionstorage-localstorage-com-reactjs-context-api-e-node-no-backend-4jmo</link>
      <guid>https://dev.to/guillerbr/autenticacao-cookies-http-http-only-jwt-sessionstorage-localstorage-com-reactjs-context-api-e-node-no-backend-4jmo</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Útil para você, considere me pagar um café. Obrigado!&lt;/li&gt;
&lt;li&gt;Useful for you, consider buying me a coffee. Thanks!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ETH:&lt;br&gt;
0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcoinqrcodemaker.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bitcoinqrcodemaker.com%2Fapi%2F%3Fstyle%3Dethereum%26address%3D0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc" alt="Ethereum QR Code Generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Visão geral
&lt;/h1&gt;

&lt;p&gt;O objetivo desta artigo é apresentar, discutir e fornecer técnicas de mitigação específicas sobre as melhores práticas de autenticação e sessão de usuários, usando &lt;em&gt;Cookies, Http Only, JWT, Sessão, LocalStorage, e outros métodos.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cookies Http
&lt;/h2&gt;

&lt;p&gt;Um cookie HTTP (um cookie web ou cookie de navegador) é um pequeno fragmento de dados que um servidor envia para o navegador do usuário. O navegador pode armazenar estes dados e enviá-los de volta na próxima requisição para o mesmo servidor. Normalmente é utilizado para identificar se duas requisições vieram do mesmo navegador — ao manter um usuário logado, por exemplo. Ele guarda informações dinâmicas para o protocolo HTTP sem estado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cookies são usados principalmente para três propósitos:
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Gerenciamento de sessão:
&lt;/h5&gt;

&lt;p&gt;Logins, carrinhos de compra, placar de jogos ou qualquer outra atividade que deva ser guardada por um servidor.&lt;/p&gt;

&lt;h5&gt;
  
  
  Personalização:
&lt;/h5&gt;

&lt;p&gt;Preferências de usuário, temas e outras configurações.&lt;/p&gt;

&lt;h5&gt;
  
  
  Rastreamento:
&lt;/h5&gt;

&lt;p&gt;Registro e análise do comportamento de um usuário.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Podemos definir o tempo de expiração para cada cookie&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O limite de 4K é para o cookie inteiro, incluindo nome, valor, data de expiração, etc. Para suportar a maioria dos navegadores, mantenha o nome abaixo de 4000 bytes e o tamanho geral do cookie abaixo de 4093 bytes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados são enviados de volta ao servidor para cada solicitação HTTP (HTML, imagens, JavaScript, CSS, etc) — aumentando a quantidade de tráfego entre o cliente e o servidor.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Http Only
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqh0wmupnkvrq8vp8ig8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqh0wmupnkvrq8vp8ig8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é HttpOnly?
&lt;/h4&gt;

&lt;p&gt;Acordo com a Microsoft Developer Network , HttpOnly é um sinalizador adicional incluído em um cabeçalho de resposta HTTP Set-Cookie. Usar o sinalizador HttpOnly ao gerar um cookie ajuda a mitigar o risco de o script do lado do cliente acessar o cookie protegido (se o navegador oferecer suporte).&lt;/p&gt;

&lt;p&gt;Para se prevenir de ataques cross-site scripting (XSS), os cookies &lt;em&gt;HttpOnly&lt;/em&gt; são inacessíveis para a API JavaScript Document.cookie (en-US); eles são enviados só para o servidor. Por exemplo, cookies que persistem sessões de servidor não precisam estar disponíves para o JavaScript, e portanto a diretiva &lt;em&gt;HttpOnly&lt;/em&gt; deve ser configurada.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

_Set-Cookie: &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a3fWa&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;Expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Wed, 21 Oct 2015 07:28:00 GMT&lt;span class="p"&gt;;&lt;/span&gt; Secure&lt;span class="p"&gt;;&lt;/span&gt; HttpOnly_


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Um cookie &lt;em&gt;HttpOnly&lt;/em&gt; é uma tag adicionada a um cookie do navegador que impede que os scripts do lado do cliente acessem os dados. Ele fornece uma porta que evita que o cookie especializado seja acessado por qualquer coisa que não seja o servidor. Usar a tag HttpOnly ao gerar um cookie ajuda a reduzir o risco de scripts do lado do cliente acessarem o cookie protegido, tornando esses cookies mais seguros.&lt;/p&gt;

&lt;h5&gt;
  
  
  O exemplo abaixo mostra a sintaxe usada no cabeçalho de resposta HTTP:
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

Set-Cookie: &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“[&lt;span class="p"&gt;;&lt;/span&gt; “&lt;span class="o"&gt;=&lt;/span&gt;“]&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“][&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“]&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;“][&lt;span class="p"&gt;;&lt;/span&gt; secure][&lt;span class="p"&gt;;&lt;/span&gt; HttpOnly]&lt;span class="sb"&gt;`&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Se o sinalizador &lt;strong&gt;HttpOnly for incluído no cabeçalho de resposta HTTP, o cookie não poderá ser acessado por meio do script do lado do cliente.&lt;/strong&gt; Como resultado, mesmo que exista uma falha de script entre sites (XSS) e um usuário acesse acidentalmente um link que explora a falha, o navegador não revelará o cookie para terceiros.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo - digamos que um navegador detecte um cookie contendo o sinalizador &lt;em&gt;HttpOnly&lt;/em&gt;. Se o código do lado do cliente tentar ler o cookie, o navegador retornará uma string vazia como resultado. Isso ajuda a &lt;em&gt;evitar que códigos maliciosos (geralmente cross-site scripting (XSS))&lt;/em&gt; enviem dados para o site de um invasor.&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpz9k516q6cxhps8xo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpz9k516q6cxhps8xo0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Autenticação de usuário utilizando o mecanismo chamado JWT (JSON Web Token)
&lt;/h4&gt;

&lt;p&gt;Estratégia de autenticação para APIs em REST simples e segura. Trata-se de um padrão aberto para autenticações web e é totalmente baseada em requests JSON entre o cliente e servidor. Seu mecanismo de autenticação funciona da seguinte maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O cliente faz uma solicitação uma única vez ao enviar as credenciais de login e senha;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor valida as credenciais e, se tudo estiver certo, ele retorna para o cliente um JSON com um token que codifica dados de um usuário logado no sistema;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após receber o token, o cliente pode armazená-lo da forma que preferir, seja por LocalStorage, SessionStorage, Cookies e HTTP Only e ou outros mecanismos de armazenamento do lado do cliente;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Toda vez que o cliente acessa uma rota que requer autenticação, ele apenas envia esse token para a API para autenticar e liberar os dados de consumo;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor sempre valida esse token para permitir ou bloquear uma solicitação de cliente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  JWT (JSON Web Token) é um método RCT 7519 padrão da indústria para realizar autenticação entre duas partes por meio de um token assinado que autentica uma requisição web. Esse token é um código em Base64 que armazena objetos JSON com os dados que permitem a autenticação da requisição.
&lt;/h6&gt;

&lt;p&gt;Com um &lt;em&gt;token&lt;/em&gt; construído e seguro, é matematicamente impossível decodificar a assinatura sem ter o segredo-chave da aplicação. Porém, uma vez em posse do segredo, qualquer aplicação pode decodificar a assinatura e verificar se ela é válida. Isso é feito gerando uma &lt;em&gt;signature&lt;/em&gt; utilizando o header e o &lt;em&gt;payload&lt;/em&gt; fornecidos pelo cliente para então comparamos essa &lt;em&gt;signature&lt;/em&gt; gerada com a presente no &lt;em&gt;token&lt;/em&gt; enviado pelo cliente. Uma vez que as assinaturas sejam idênticas, podemos permitir o acesso do cliente a uma área restrita da nossa aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jwt.io/" rel="noopener noreferrer"&gt;https://jwt.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SessionStorage e LocalStorage
&lt;/h2&gt;

&lt;h4&gt;
  
  
  SessionStorage
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;sessionStorage&lt;/strong&gt; é similar ao localStorage , a única diferença é que enquanto os dados armazenados &lt;strong&gt;no localStorage não expiram, os dados no sessionstorage tem os seus dados limpos ao expirar a sessão da página.&lt;/strong&gt; A sessão da página dura enquanto o browser está aberto e se mantém no recarregamento da página.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O armazenamento na Web pode ser visto de maneira simplista como uma melhoria nos cookies, oferecendo uma capacidade de armazenamento muito maior. O tamanho disponível é de 5 MB, o que representa consideravelmente mais espaço para trabalhar do que um cookie típico de 4KB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados não são enviados de volta ao servidor para cada solicitação HTTP (HTML, imagens, JavaScript, CSS, etc) — reduzindo a quantidade de tráfego entre o cliente e o servidor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados armazenados no localStorage persistem até serem excluídos explicitamente. As alterações feitas são salvas e estão disponíveis para todas as visitas atuais e futuras ao site.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Funciona na política de mesma origem. Portanto, os dados armazenados só estarão disponíveis na mesma origem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  LocalStorage
&lt;/h4&gt;

&lt;p&gt;Usam o &lt;em&gt;localStorage&lt;/em&gt; para armazenar variáveis temporárias.&lt;/p&gt;

&lt;p&gt;É semelhante ao localStorage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As alterações só estão disponíveis por janela (ou em navegadores como o Chrome e o Firefox). As alterações feitas são salvas e disponibilizadas para a página atual, bem como futuras visitas ao site na mesma janela. Depois que a janela é fechada, o armazenamento é excluído&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados estão disponíveis somente dentro da janela / guia na qual foram definidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados não são persistentes, isto é, serão perdidos quando a janela / guia for fechada. Como o localStorage, ele funciona na política de mesma origem. Portanto, os dados armazenados só estarão disponíveis na mesma origem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Considerações Local e Session Storage
&lt;/h5&gt;

&lt;p&gt;Ambos &lt;em&gt;localStorage e sessionStorage&lt;/em&gt; se extendem de &lt;em&gt;Storage&lt;/em&gt;. Não há diferença entre eles, exceto para a não-persistência de &lt;em&gt;sessionStorage&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A não-persistência como descrito acima é no sentido de que &lt;em&gt;sessionStorage&lt;/em&gt; se faz disponível apenas para a janela que criou os dados até que tal janela seja fechada, ao abrir outra janela(ou aba) tais dados não estarão disponíveis.&lt;/p&gt;

&lt;p&gt;Em contrapartida de &lt;em&gt;sessionStorage&lt;/em&gt;, ao criar dados em &lt;em&gt;localStorage&lt;/em&gt; esses dados estarão disponíveis para qualquer aba/janela mesmo que o usuário encerre a janela, reinicie o sistema, etc.&lt;/p&gt;

&lt;p&gt;Um exemplo, supondo que você deseja salvar o nome de usuário e senha para realizar um login, é provável que você opte por armazenar esses dados em sessionStorage por motivos de segurança e salvar as configurações de usuário em localStorage.&lt;/p&gt;

&lt;h1&gt;
  
  
  Aplicação do Mundo Real
&lt;/h1&gt;

&lt;p&gt;Armazenar um token de usuário.Nesta etapa, você armazenará o token do usuário. Você implementará diferentes opções de armazenamento de &lt;em&gt;tokens&lt;/em&gt; e aprenderá as implicações de segurança de cada abordagem. Por fim, você aprenderá como diferentes abordagens mudarão a experiência do usuário à medida que ele abre novas guias ou fecha uma sessão.&lt;/p&gt;

&lt;p&gt;Ao final desta etapa, você poderá escolher uma abordagem de armazenamento com base nos objetivos de seu aplicativo.&lt;/p&gt;

&lt;p&gt;Existem várias opções para armazenar &lt;em&gt;tokens&lt;/em&gt;. Cada opção tem custos e benefícios. Resumidamente, as opções são: armazenar na memória &lt;em&gt;JavaScript&lt;/em&gt;, armazenar &lt;em&gt;sessionStorage&lt;/em&gt;, armazenar &lt;em&gt;localStorage&lt;/em&gt; e armazenar em um cookie . A principal compensação é a segurança. Qualquer informação armazenada fora da memória do aplicativo atual é &lt;em&gt;vulnerável a ataques de Cross-Site Scripting (XSS)&lt;/em&gt; .&lt;/p&gt;

&lt;p&gt;&lt;em&gt;O perigo é que, se um usuário mal-intencionado é capaz de carregar código em sua aplicação, ele pode acessar localStorage, sessionStorage e qualquer cookie que também é acessível a sua aplicação&lt;/em&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O benefício dos métodos de armazenamento sem memória é que você pode reduzir o número de vezes que um usuário precisará efetuar login para criar uma melhor experiência do usuário.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Este tutorial irá cobrir &lt;em&gt;sessionStorage, localStorage, Cookies e HTTP Only&lt;/em&gt;, uma vez que estes são mais modernos.
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento de Sessão
Para testar os benefícios de armazenamento fora da memória, converta o armazenamento na memória para &lt;em&gt;sessionStorage&lt;/em&gt;. Aberto App.js:&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Usando o cliente frontend ReactJs para interfaces para o usuário.
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Você deve ter conhecimentos básicos e intermediários sobre &lt;em&gt;ReactJs&lt;/em&gt; para compreender mais facilmente a implantação de um serviço de autenticação &lt;em&gt;segura&lt;/em&gt; e &lt;em&gt;moderna&lt;/em&gt;, amplamente recomendada e usada pela &lt;em&gt;comunidade de software livre&lt;/em&gt; para autenticar um usuário em um sistema web.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quais são as vulnerabilidades?
&lt;/h2&gt;

&lt;p&gt;Ambos os métodos vêm com possíveis problemas de segurança relacionados:&lt;/p&gt;

&lt;h2&gt;
  
  
  Método           Vulnerabilidade
&lt;/h2&gt;

&lt;p&gt;Armazenamento local XSS - script entre sites&lt;br&gt;
Cookies CSRF -          Falsificação de solicitação entre sites&lt;/p&gt;

&lt;p&gt;Uma vulnerabilidade XSS permite que um invasor injete JavaScript em um site.&lt;br&gt;
Uma vulnerabilidade CSRF permite que um invasor execute ações em um site por meio de um usuário autenticado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como posso contornar isso?
&lt;/h2&gt;

&lt;p&gt;Se o armazenamento local pode ser explorado por scripts de terceiros (como aqueles encontrados nas extensões do navegador) e se a autenticação pode ser falsificada com cookies, onde é aceitável colocar o estado do cliente?&lt;/p&gt;

&lt;p&gt;Na autenticação de aplicativo de página única usando cookies nos documentos do Auth0, aprendemos que se seu aplicativo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É servido ao cliente usando seu próprio back-end&lt;/li&gt;
&lt;li&gt;Tem o mesmo domínio que seu back-end&lt;/li&gt;
&lt;li&gt;Faz chamadas de API que requerem autenticação para seu back-end&lt;/li&gt;
&lt;li&gt;Então há uma maneira de usar cookies para autenticação com segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  EM DESENVOLVIMENTO E CONSTRUÇÃO
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Links e Referências:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://owasp.org/www-community/HttpOnly" rel="noopener noreferrer"&gt;https://owasp.org/www-community/HttpOnly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@ryanchenkie_40935/react-authentication-how-to-store-jwt-in-a-cookie-346519310e81" rel="noopener noreferrer"&gt;https://medium.com/@ryanchenkie_40935/react-authentication-how-to-store-jwt-in-a-cookie-346519310e81&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Cookies" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Cookies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Window/sessionStorage" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/Window/sessionStorage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.taniarascia.com/full-stack-cookies-localstorage-react-express/" rel="noopener noreferrer"&gt;https://www.taniarascia.com/full-stack-cookies-localstorage-react-express/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-add-login-authentication-to-react-applications#prerequisites" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/how-to-add-login-authentication-to-react-applications#prerequisites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.devmedia.com.br/como-o-jwt-funciona/40265" rel="noopener noreferrer"&gt;https://www.devmedia.com.br/como-o-jwt-funciona/40265&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>authentication</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Deploy ReactJS no Firebase Hosting</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Wed, 18 Nov 2020 04:10:08 +0000</pubDate>
      <link>https://dev.to/guillerbr/deploy-reactjs-no-firebase-hosting-1l6f</link>
      <guid>https://dev.to/guillerbr/deploy-reactjs-no-firebase-hosting-1l6f</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Útil para você, considere me pagar um café. Obrigado!&lt;/li&gt;
&lt;li&gt;Useful for you, consider buying me a coffee. Thanks!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ETH:&lt;br&gt;
0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcoinqrcodemaker.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bitcoinqrcodemaker.com%2Fapi%2F%3Fstyle%3Dethereum%26address%3D0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc" alt="Ethereum QR Code Generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiramente precisamos que você tenha conhecimentos em &lt;strong&gt;React, Node, Java Script, GIT, FRONTEND, Deploy&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Por favor se isso for útil e ajudar no seu propósito, considere me ofertar um café, obrigado, que possamos evoluir juntos! &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Please if this is useful and helps in your purpose, consider offering me a coffee, thank you, so we can evolve together!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Envie atráves da rede &lt;strong&gt;Ethereum&lt;/strong&gt; - &lt;br&gt;
Send over the network &lt;strong&gt;Ethereum&lt;/strong&gt; -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você precisa de uma conta no serviço &lt;strong&gt;Firebase&lt;/strong&gt;, &lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;https://firebase.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá para o console do &lt;em&gt;Firebase&lt;/em&gt;&lt;br&gt;
&lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;https://console.firebase.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal7ut5behlrybyjsbowz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fal7ut5behlrybyjsbowz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft7lz2mm79bon5j78m5fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft7lz2mm79bon5j78m5fo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crie um novo projeto com o nome. Pronto, agora que temos o projeto criado podemos utilizar várias ferramentas do &lt;strong&gt;Firebase&lt;/strong&gt;, uma delas é a &lt;strong&gt;Hosting&lt;/strong&gt;, mas fique livre para utilizar outras,nesse artigo trataremos apenas de hospedagem.&lt;/p&gt;

&lt;p&gt;No painel do Firebase clique em &lt;strong&gt;Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgmjd2qfth5dbfok6d6ya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgmjd2qfth5dbfok6d6ya.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você precisa de um projeto frontend em &lt;strong&gt;React&lt;/strong&gt; já pronto, e então faremos a construção (build) desse projeto no hosting da firebase, usaremos também o domínio fornecido por eles, mas claro futuramente podemos alterar.&lt;/p&gt;

&lt;p&gt;Você precisará ter o pacote de dependência do &lt;strong&gt;Firebase&lt;/strong&gt; para o &lt;strong&gt;Node js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instale o pacote do &lt;strong&gt;firebase-tools&lt;/strong&gt; globalmente,esse pacote estará instalado no seu computador e não no projeto em si.Esse utilitário do firebase , nos ajudará a executar comandos e conectar aquele projeto que criamos no hosting do firebase.&lt;br&gt;
Execute o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm install -g firebase-tools


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos para o console shell, dentro da pasta do projeto &lt;em&gt;React&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Usarei esse projeto React como exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/guillerbr/ghd-sites" rel="noopener noreferrer"&gt;https://github.com/guillerbr/ghd-sites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clone o projeto e entre na pasta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Furqsuz19egvc6ganer85.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Furqsuz19egvc6ganer85.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instale a aplicação, pacotes e dependências.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm install


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Dentro da raiz do seu projeto React, digite o comando para a construção (build).&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm build


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;ou:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm run-script build


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Então o &lt;strong&gt;npm&lt;/strong&gt; cria os arquivos estáticos já transpilados e configurados para serem arquivos leves. Após rodar o comando ele criará uma pasta &lt;strong&gt;build&lt;/strong&gt; onde estará os arquivos que precisamos.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgutrt16chz4mx5yanq70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgutrt16chz4mx5yanq70.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frj7fyzrntjqa01o2uglq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frj7fyzrntjqa01o2uglq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos ligar nossa aplicação React ao nosso serviços de Hosting do Firebase.Para isso usaremos o &lt;strong&gt;firebase-tools&lt;/strong&gt; que instalamos no começo.&lt;br&gt;
Digite o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

firebase login


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Você precisar estar autenticado na conta do Google Firebase com seu navegador, após o comando acima o Google pode pedir alguma verificação para ligar sua aplicação no console Shell, a sua conta no Firebase no navegador. Se o Google abrir o Browser e pedir autenticação da conta. Aceite e conclua a operação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb42x44uteveg1obp0ddq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb42x44uteveg1obp0ddq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto! O console informa que estou autenticado e informa meu &lt;em&gt;e-mail&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dentro da raiz do projeto, vamos digitar os comandos para configurações finais.&lt;br&gt;
Digite o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

firebase init


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aceite a confirmação, e terá essas opções no console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6juhl4ninpt00gnukif2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6juhl4ninpt00gnukif2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Escolha a opção:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Hosting: Configure files for Firebase Hosting and (optionally) set up Guithub Action deploys 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora teremos a nova etapa de configuração:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7h25svr9g8nsy1pvwu7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7h25svr9g8nsy1pvwu7i.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Escolha a opção:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Use an existing project  


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Irá aparcer um lista de projetos e seus nomes.Agora precisamos escolher o nome do projeto que criamos no firebase.O meu é &lt;strong&gt;ghdsites2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs8c3hvbvwh45nh05yish.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs8c3hvbvwh45nh05yish.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora cairemos na parte de configuração do diretório público.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z9n7jos2ms9v7jwhgps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z9n7jos2ms9v7jwhgps.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora digite o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

build  


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aparecerá essa pergunta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Configure as a single-page app (rewrite all urls to /index.html)? (y/N)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Escolha a opção: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

yes


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aparecerá essa pergunta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

File build/index.html already exists. Overwrite? (y/N)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Escolha a opção: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

no


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3ev4meprhtbvzokk7ldw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3ev4meprhtbvzokk7ldw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora iremos para a parte final de construção.&lt;br&gt;
Digite o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

firebase deploy


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcq9mnojalpkgu6h98au9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcq9mnojalpkgu6h98au9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRONTO!&lt;br&gt;
FINALMENTE!&lt;/p&gt;

&lt;p&gt;Depois de fazer todos esse procedimentos, o console do firebase informará que o processo foi finalizado com sucesso e sua aplicação já está hospedada com um domínio e pronta para ser acessada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1qx3pbxd3oeubkfjdvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1qx3pbxd3oeubkfjdvh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobq3kq3h7jjkgjnui2oq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobq3kq3h7jjkgjnui2oq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tutorial em Vídeo:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=XoxvXleVZV4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=XoxvXleVZV4&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>devops</category>
      <category>firebase</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Node,Mongo, Mongoose Essentials - CRUD App for Relational Database</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Sun, 02 Aug 2020 18:32:30 +0000</pubDate>
      <link>https://dev.to/guillerbr/node-mongo-mongoose-essentials-crud-app-for-relational-database-k89</link>
      <guid>https://dev.to/guillerbr/node-mongo-mongoose-essentials-crud-app-for-relational-database-k89</guid>
      <description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5H0geGYv_A0"&gt;https://www.youtube.com/watch?v=5H0geGYv_A0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/mkilmer/how-create-relationships-with-mongoose-and-node-js-with-real-example-43ei"&gt;https://dev.to/mkilmer/how-create-relationships-with-mongoose-and-node-js-with-real-example-43ei&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/employbl/build-database-relationships-with-node-js-and-mongodb-74e35c315cf"&gt;https://medium.com/employbl/build-database-relationships-with-node-js-and-mongodb-74e35c315cf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Learn/Server-side/Express_Nodejs/mongoose"&gt;https://developer.mozilla.org/pt-BR/docs/Learn/Server-side/Express_Nodejs/mongoose&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Documentar uma API em Laravel com o Apirus Ferramenta visual</title>
      <dc:creator>Guiller</dc:creator>
      <pubDate>Wed, 10 Jun 2020 21:58:00 +0000</pubDate>
      <link>https://dev.to/guillerbr/documentar-uma-api-em-laravel-com-o-apirus-ferramenta-visual-2n85</link>
      <guid>https://dev.to/guillerbr/documentar-uma-api-em-laravel-com-o-apirus-ferramenta-visual-2n85</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Útil para você, considere me pagar um café. Obrigado!&lt;/li&gt;
&lt;li&gt;Useful for you, consider buying me a coffee. Thanks!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ETH:&lt;br&gt;
0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcoinqrcodemaker.com"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U5fW4Ssa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.bitcoinqrcodemaker.com/api/%3Fstyle%3Dethereum%26address%3D0xdfaf8F1bCaaB513A14E5a0B8C2D0bF7EE6ECabbc" alt="Ethereum QR Code Generator" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referência:&lt;br&gt;
&lt;a href="https://github.com/vaneves/apirus"&gt;https://github.com/vaneves/apirus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crie um novo projeto Laravel,dentro dele, adicione a Apirus ferramenta ao projeto, digite o comando de instalação:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;composer create-project --prefer-dist vaneves/apirus&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Se for instalar fora de um projeto Laravel,use o comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;composer create-project --prefer-dist vaneves/apirus meu_projeto&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Entre na pasta &lt;strong&gt;apirus&lt;/strong&gt;.&lt;br&gt;
Altere o nome do arquivo .env.exemple para .env&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp .env.example .env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;No arquivo .env altere as variáveis de ambientes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_URL=http://example.com/api

SOURCE=
DIST=
THEME=
HIGHTLIGHT=  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entre na pasta &lt;strong&gt;apirus&lt;/strong&gt;,e depois em DOCS,será nesse diretório que devemos enviar a documentação da nossa API,no formato markdown,para que o interpretador nos forneça uma interface visual e de fácil manipulação e teste.&lt;/p&gt;

&lt;p&gt;Dentro do diretório /docs atualize sua documentação enviando seu novo diretório com os arquivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l-VRXRAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/98q6twjnwywskubmcbm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l-VRXRAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/98q6twjnwywskubmcbm0.png" alt="Alt Text" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro da sua pasta &lt;strong&gt;DOCS&lt;/strong&gt;,deve ter algo como isso.Arquivos em &lt;br&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; .md que irão formatar os código para que a interface gráfica da ferramenta,possa nos fornecer uma documentação e teste mais amigável.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DZzijZsW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1pq1hotfdzbx5ejqmcqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DZzijZsW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1pq1hotfdzbx5ejqmcqs.png" alt="Alt Text" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após fazer o processo,precisamos buildar as atualizações,digitaremos os seguintes comandos:&lt;/p&gt;

&lt;p&gt;Entre na pasta apirus&lt;/p&gt;

&lt;p&gt;-localhost/apirus&lt;/p&gt;
&lt;h3&gt;
  
  
  Digite o comando inicial
&lt;/h3&gt;

&lt;p&gt;Incialmente:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php apirus&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Digite o comando de finalização
&lt;/h3&gt;

&lt;p&gt;E para atualizar a documentação digite esse comando após atualizar seu diretório em /docs. Comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php apirus --src docs -h monokai&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fb_EQGqC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ibdk1i01d760s1xo18cm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fb_EQGqC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ibdk1i01d760s1xo18cm.png" alt="Alt Text" width="651" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto,tudo certo,podemos ter como resultado a documentação da api em:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://localhost/meu_projeto/public/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BbxkHL2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6tl179cdoe2b49yebrnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BbxkHL2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6tl179cdoe2b49yebrnn.png" alt="Alt Text" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em desenvolvimento/finalização&lt;br&gt;
Vídeo Tutorial:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=qKJX56K6QdY"&gt;https://www.youtube.com/watch?v=qKJX56K6QdY&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
    </item>
  </channel>
</rss>
