bibliomar / bibliomar-client

The front-end client for Bibliomar: A complete reading suite built for educational purposes.
https://www.bibliomar.site
MIT License
12 stars 3 forks source link

Criar uma nova tela de login automático #5

Closed Lamarcke closed 1 year ago

Lamarcke commented 2 years ago

Atualmente, ao entrar na tela de login o usuario se depara com um texto que indica o inicio do "login automatico".

O objetivo dessa mudança é criar um novo componente, dentro de uma nova rota, que irá realizar essa tarefa de login automatico.

Esse issue é ideal para iniciantes, devido a sua baixa complexidade. Também é interessante para quem quer se familiarizar com o código e como as requisições para o Biblioterra funcionam.

Antes de começar: Deixe a documentação do Biblioterra aberta, lá você pode fazer as requisições diretamente do seu navegador. Siga o tutorial básico para deixar seu ambiente de desenvolvimento pronto.

Requisitos gerais:

Você deve criar uma nova rota que vai levar ao seu novo componente, nós utilizamos o react-router no Bibliomar, e você pode aprender sobre ele aqui: Nós usamos componentes funcionais no Bibliomar (isso significa que usamos funções ao invés de classes). As requisições devem ser feitas utilizando a biblioteca axios, ou a padrão do navegador fetch.
Não há requisitos quanto a forma que você quer apresentar essa tela de login. Apenas lembre-se que em todo o site incluímos o componente <Navbar />, que é a barra de navegação e usamos a classe css bg-alt como plano de fundo.

Dicas gerais:

Essas dicas devem lhe ajudar a se situar em como o processo de autenticação (e consequentemente, re-autenticação) funciona.

Você irá trabalhar com uma rota principal, a /user/validate, ela vai receber um token JWT, e retornará um novo token com uma data de expiração postergada. (Vamos entender melhor, passo a passo)

Passo a passo:

Adicione sua rota no aplicativo:
Navegue até o arquivo App.tsx e sem seguida adicione o seguinte dentro da parte de <Routes>:

<Routes>
  // ...
  // Não substitua as outras rotas, apenas adicione isso ao final
  <Route path="/autologin" element={<SeuNovoComponente />} />
</Routes>

Isso vai definir que toda vez que alguém entrar na url /autologin, seu componente será renderizado.

Já no seu componente, salve o valor do token em alguma variavel:

const jwtToken = localStorage.getItem("jwt-token")

Em seguida, envie sua requisição com esse token no cabeçalho Authorization: Usamos a biblioteca axios nesse exemplo

const config = {
  url: "https://biblioterra.herokuapp.com/v1/user/validate",
  method: "GET",
  /* Parte importante */
  headers: {
    Authorization: `Bearer ${jwtToken}`,
  },
};

Em seguida, faça sua requisição, utilizando async/await ou promises.

let req = await axios.request(config);

ou

axios.request(config).then(...);

Você pode verificar o status e o corpo da requisição usando:

// Status
req.status
// Corpo (com o token JWT)
req.data

Caso o status da requisição retorne OK (200), salve o novo token no localStorage:

const newToken = req.data["access_token"]  

//Sempre nomeie a chave como "jwt-token", ou ela não será usada no resto do site.  
localStorage.setItem("jwt-token", newToken)  

Seu melhor amigo nessa hora é o hook useEffect(), que vai executar seu código assim que o usuario entrar na página e ela renderizar. Lembre-se sempre de adicionar tratamento de erros. Cheque a documentação da biblioteca de requisições que você está usando para entender como fazer isso.

Agradeço o interesse, e estou aberto a responder qualquer pergunta ou sugestão, boa sorte!

Lamarcke commented 1 year ago

Isso se tornou desnecessário devido a nova forma como lidamos com as requisições de autenticação.