‫Narrador: Até agora, em nossa implementação
‫de autenticação, registramos os usuários com uma senha correta.
‫Então, basicamente, concluímos esta primeira etapa do fluxo de trabalho
‫de autenticação, em que
‫um token da web JSON é criado
‫e enviado de volta ao cliente se o
‫usuário fornecer um e-mail e uma senha corretos.
‫Então, a seguir, implementaremos rotas protegidas.
‫Basicamente, usando o token da Web JSON
‫criado para dar aos usuários logados acesso a rotas protegidas.
‫E esta é a segunda etapa da autenticação.
‫E agora vamos implementar essa funcionalidade.
‫Digamos que desejamos proteger
‫a rota getAllTours.
‫Então, basicamente, apenas permitindo que usuários logados tenham
‫acesso a uma lista de todos os nossos passeios.
‫E o que significa é que, antes de
‫executar o manipulador get all tours,
‫vamos dar uma olhada nisso.
‫Ok, então antes de executar este identificador aqui,
‫precisaríamos fazer uma verificação para
‫verificar se o
‫usuário está realmente logado ou não, certo?
‫E então a melhor
‫maneira de fazer isso, como você
‫já sabe, provavelmente, é usar uma função de middleware, certo?
‫Então, neste vídeo, para proteger
‫as rotas, vamos criar uma função de
‫middleware que será executada antes de cada um desses manipuladores, ok.
‫Então, uma função que ficará bem aqui,
‫antes que esta função aqui possa ser executada.
‫E esse middleware irá retornar um erro
‫se o usuário não estiver autenticado,
‫então, se ele
‫não estiver logado, ou irá
‫chamar o próximo middleware que neste caso é o manipulador getAllTours, certo?
‫E que do que eficaz protege esta
‫rota de acessos não autorizados.
‫Portanto, vamos criar rapidamente essa
‫função de middleware e
‫colocá-la aqui
‫para ilustrar o que acabei de dizer.
‫Ok, então aqui em nosso controlador de autenticação novamente,
‫criaremos uma nova função de middleware
‫e é chamada de proteger.
‫Tudo bem,
‫e assim como antes, vou usar catchAsync
‫porque, mais uma vez, todas essas funções
‫são funções assíncronas, na verdade.
‫Tudo bem, e aqui, é claro, nossa função de
‫middleware e, por enquanto, vamos simplesmente chamar next
‫aqui apenas para que tenhamos realmente qualquer corpo
‫aqui nesta função de
‫middleware e, em seguida, vamos voltar às
‫nossas rotas de passeio e proteger essa rota, ok ?
‫Portanto, antes de mais nada, preciso realmente exigir
‫este módulo controlador de autenticação.
‫Então
‫const e, em seguida, requer
‫que esteja nos controladores
‫e, em seguida, authController, ok.
‫Então, agora vamos conectá-lo,
‫bem aqui na rota getAllTours.
‫OK.
‫Portanto, authController. proteger.
‫OK.
‫E agora esta função de middleware será executada primeiro
‫e novamente, se o usuário não for autenticado, haverá
‫um erro.
‫E, claro, o próximo middleware para
‫que aquele que
‫realmente recebe e envia todos os tours não seja executado.
‫OK.
‫E, novamente, isso protegerá efetivamente o acesso
‫a este recurso de usuários que não estão logados.
‫Tudo bem, então vamos voltar aqui.
‫Não as rotas do
‫usuário, mas o controlador de autenticação.
‫Tudo bem, e agora sobre a implementação desse
‫middleware de proteção.
‫O que exatamente teremos que fazer?
‫Bem, vamos começar delineando algumas etapas aqui.
‫Tudo bem, na verdade, primeiro de tudo, precisamos marcar
‫essa função como Async, caso contrário, não precisaríamos
‫realmente do catchAsync, certo?
‫E você verá por que precisamos que isso seja uma função
‫Async em um segundo, certo?
‫Mas agora vamos definir as etapas
‫que precisamos seguir para implementar esse middleware de proteção.
‫Assim como antes,
‫vou colocar essas etapas aqui como comentários.
‫Primeiro, precisamos realmente obter o token.
‫E
‫verifique se ele está lá basicamente,
‫então verifique se ele existe.
‫Em seguida, precisamos validar o token.
‫E esta é basicamente aquela etapa
‫superimportante da qual falamos antes, em que o algoritmo JWT verifica se
‫a assinatura é válida ou
‫não.
‫Portanto, se o token é válido ou não, certo?
‫E então vamos chamar isso de verificação.
‫Acho que é assim que chamamos naquele slide onde
‫falamos sobre isso antes, tudo bem.
‫E se você realmente não se lembra como
‫funcionou, bem, você
‫sempre pode voltar e assistir a essa palestra, certo?
‫Em seguida, se a verificação foi realmente bem-sucedida, também precisamos
‫verificar se o usuário que está tentando
‫acessar a rota ainda existe, certo?
‫Portanto, verifique se o usuário ainda existe e falarei mais
‫sobre por que cada
‫uma dessas etapas é necessária assim que começarmos a implementá-las, certo?
‫Portanto, por enquanto, isso pode não fazer muito sentido
‫para você, mas, novamente, falarei sobre cada parada assim que chegarmos lá.
‫Tudo bem?
‫E, por fim, também precisamos
‫verificar
‫se o usuário alterou
‫a senha após o
‫JWT ter sido emitido, certo?
‫Bem, vamos apenas dizer token aqui,
‫nós o chamamos de token em todos os outros lugares, certo?
‫E assim, somente se não houver problemas
‫em qualquer uma dessas etapas
‫aqui, só então é claro que o próximo será chamado,
‫o que terá acesso à rota que protegemos.
‫Portanto, em nosso exemplo atual, novamente, este manipulador getAllTours.
‫Direito?
‫Ok, mas vamos voltar
‫e começar a implementar nossa primeira etapa aqui.
‫Então, basicamente pegue o
‫token e verifique se ele realmente existe.
‫Portanto, uma prática comum é enviar um token usando um cabeçalho
‫http com a solicitação, certo?
‫Então, vamos dar uma olhada em como podemos definir cabeçalhos no
‫Postman para enviá-lo junto com
‫a solicitação e também como podemos obter
‫acesso a esses cabeçalhos no Express.
‫E vamos fazer isso primeiro.
‫Então, aqui no apt. js Acho que temos este bom
‫middleware aqui, então vamos realmente fazer o login
‫na solicitação do console. cabeçalhos, Ok, então
‫falamos sobre cabeçalhos http antes, e é
‫assim que podemos ter acesso a eles no Express.
‫Ok, basicamente para os cabeçalhos de solicitação, aqueles
‫que um cliente pode enviar junto com sua solicitação.
‫Ok, e aqui no Postman, vamos realmente chegar
‫à rota que estamos tentando proteger.
‫E aqui defina um cabeçalho.
‫E vamos apenas
‫fazer um teste e configurá-lo para Jonas, ok?
‫Agora vou apenas enviar
‫isso e aqui no Express, vamos dar uma olhada nisso.
‫E, de fato, aqui obtemos um objeto com todos os cabeçalhos
‫que fazem parte da solicitação.
‫Então, tudo isso aqui.
‫E você vê que há um monte de cabeçalhos
‫que o Postman envia automaticamente junto com a solicitação,
‫por exemplo, ele diz que o agente do usuário é o Postman,
‫ele também envia o host, e alguns
‫outros sobre os quais falaremos mais tarde,
‫como aceitar por exemplo.
‫Agora, o que importa aqui é o cabeçalho que
‫definimos para nós mesmos.
‫Ok, então o cabeçalho de teste definido como Jonas que acabamos
‫de enviar em nossa solicitação.
‫Agora, para enviar um token da web JSON como cabeçalho, existe
‫um padrão para fazer isso.
‫Então vamos voltar aqui, nos livrar de tudo isso.
‫E então esse padrão para enviar um token é que
‫devemos sempre usar um cabeçalho chamado autorização.
‫OK?
‫Assim, o valor
‫desse cabeçalho deve sempre começar com
‫Bearer, certo?
‫Porque basicamente carregamos, possuímos, possuímos esse token e aqui
‫o valor do token.
‫Assim como esta string aleatória que recebemos antes.
‫Então, vamos deixá-la como um exemplo, e então
‫vamos enviar agora.
‫E então, de fato, devemos obtê-lo aqui.
‫OK.
‫Agora o Express transforma automaticamente todos os nomes de cabeçalho
‫em minúsculas, como você pode ver aqui,
‫mas é claro, nosso valor de cabeçalho aqui ainda é o mesmo.
‫Ok, e basicamente esta parte do valor do cabeçalho é
‫o nosso token.
‫E é assim que
‫devemos ler esse token do cabeçalho.
‫Tudo bem?
‫Portanto, se realmente
‫houver necessidade. cabeçalhos. autorização, ok, e
‫se começar
‫basicamente com esta string de suporte aqui, ok, então
‫req. cabeçalhos. autorização e agora
‫isso é uma string
‫e então podemos usar startsWith
‫nisso tudo bem, então isso é apenas JavaScript normal
‫novamente, ok.
‫E essas são as condições sob as quais realmente
‫queremos salvar um token, certo?
‫Então, novamente, caso o cabeçalho
‫exista e seu valor comece com Bearer, tudo bem.
‫Nesse caso, queremos dizer que o token é igual
‫a req. cabeçalhos. autorização
‫e agora como obtemos essa segunda
‫parte da string?
‫Bem, basicamente vamos dividir a string por
‫esse caractere de espaço, certo, o
‫que criará um array
‫com este
‫Bearer e com esse token
‫e então pegaremos aquela parte
‫do array que queremos.
‫Então, divida usando espaço e,
‫a partir desse array, queremos o segundo elemento.
‫Tudo bem?
‫Agora, não podemos realmente definir uma variável dentro de
‫um bloco
‫if porque const e
‫let, então a nova variável ES6 declaratória tem
‫escopo de bloco, e
‫então tudo o que definirmos neste bloco aqui
‫não estará disponível fora dele.
‫Ok, então vamos realmente fazer isso lá fora.
‫E então simplesmente reatribua esse valor ao token.
‫OK.
‫E agora, vamos registrar o token no console apenas
‫para ver se funciona.
‫Ok, e na verdade vamos conseguir um token
‫de verdade aqui.
‫Aquele com o qual acabamos de fazer login.
‫E então coloque aquele aqui, certo.
‫Então
‫mande e ah!
‫Aqui vamos nós.
‫Então, aqui temos nossos dados de token da web JSON que acabamos de enviar
‫junto com a solicitação.
‫Vamos desligar rapidamente este log do console aqui.
‫Certo, e antes de prosseguirmos, vamos verificar
‫se o token realmente existe.
‫OK.
‫Então, se não houver
‫nenhum token, então, é claro que queremos criar um novo erro.
‫Certo, e assim como antes
‫de retornarmos deste middleware e
‫chamarmos o próximo, ok.
‫E agora aqui, criaremos um erro e iremos direto
‫para nosso middleware
‫de tratamento de erros global com esse erro.
‫Certo, então, se nenhum token for enviado com a solicitação,
‫isso significa que não estamos logados.
‫Então, vamos enviar para o usuário que você não
‫está logado.
‫Faça login para obter acesso.
‫Certo, e agora o código
‫de status para esse tipo de situação
‫é 401, o que significa não autorizado, certo?
‫Não tenho certeza se já usamos esse
‫antes e sim, na verdade também o fizemos aqui.
‫Ok, e isso basicamente significa
‫que os dados que foram enviados na solicitação estão corretos, mas
‫eles não são suficientes basicamente para obter o acesso do
‫usuário a um recurso que ele está solicitando.
‫Tudo bem.
‫Basta salvá-lo
‫aqui e testá-lo novamente.
‫Então, se basicamente tirarmos esse cabeçalho aqui, então
‫devemos ir direto para aquele erro,
‫certo?
‫E, de fato, você não está logado, faça o
‫login para obter acesso.
‫Com 401 não autorizado.
‫Excelente! Então essa parte já está funcionando.
‫Tudo bem, e agora apenas para recapitular, então
‫no momento não estamos enviando nenhum token junto com
‫a solicitação, certo?
‫E então por esse motivo, claro, não há token, ok?
‫E, portanto, criamos esse erro,
‫que acionará nosso middleware de tratamento de erros para enviar
‫esse erro de volta ao cliente, certo?
‫E é claro que não temos acesso a
‫todos os tours, porque esse
‫middleware é executado antes do controlador getAllTours.
‫E agora, isso realmente está protegido, certo?
‫Então, já está funcionando muito bem neste ponto.
‫Mas é claro que isso está longe de
‫ser suficiente, porque não é suficiente apenas enviar um token com uma solicitação.
‫Ele também precisa ser um token válido.
‫Basicamente, um token em que ninguém
‫tentou alterar a carga útil.
‫Ok, e a carga útil, lembre-se, em nosso caso
‫é sempre o user_id do usuário para o qual o token foi emitido.
‫Tudo bem, e em
‫seguida precisamos implementar esta etapa de verificação.
‫Mas esta palestra já está longa e ainda
‫há muito o que fazer aqui,
‫então vamos deixar isso para o próximo vídeo.