‫-: Bem vindo de volta.
‫Portanto, implementamos a autenticação
‫em nosso projeto até este ponto.
‫E funciona muito bem.
‫No entanto, às vezes, simplesmente autenticar, portanto, fazer o
‫login de um usuário, realmente
‫não é suficiente.
‫E, então,
‫neste vídeo, vamos implementar a autorização também.
‫Então, imagine o ato de excluir um passeio de
‫nosso banco de dados.
‫Portanto, nem todo usuário deve, é claro, ter
‫permissão para fazer isso.
‫Mesmo se o usuário estiver logado, certo?
‫Então, basicamente precisamos autorizar apenas
‫certos tipos de usuários para
‫realizar certas ações.
‫E isso é exatamente o que é autorização.
‫É verificar se determinado usuário tem direito
‫de interagir com determinado recurso.
‫Então, novamente, com autorização, basicamente verificamos se um
‫determinado usuário tem permissão para acessar um determinado recurso, mesmo que
‫ele esteja logado.
‫Portanto, nem todos os usuários logados poderão realizar as
‫mesmas ações em nossa API, certo?
‫E este é um cenário muito comum
‫que deveria ser implementado em todo e
‫qualquer aplicativo da web normalmente, certo?
‫Então, vamos construir outra função de
‫middleware aqui, desta vez para restringir certas rotas.
‫Por exemplo, para excluir passeios.
‫Então, isso significa que vamos construir outra
‫função de middleware aqui.
‫Desta vez, para restringir certas rotas, como,
‫por exemplo, excluir passeios,
‫apenas para certas funções de usuário.
‫OK?
‫E então, deixe-me mostrar como isso
‫seria na prática.
‫Portanto, aqui, nas rotas
‫de passeio, vamos voltar a esse exemplo de exclusão
‫de passeios e, portanto, vamos adicionar algum middleware à pilha aqui.
‫Portanto, authController, proteja.
‫Portanto, primeiro, sempre precisamos
‫verificar se o usuário está realmente conectado, certo?
‫Portanto, se um administrador estiver tentando excluir um tour,
‫ele ainda precisará
‫verificar se ele está realmente conectado, certo?
‫Portanto, o primeiro middleware na pilha
‫aqui, sempre será o protegido.
‫Mas então, depois desse, também
‫teremos o authController. restringir.
‫Então, restrito a, ok?
‫E para essa função passaremos algumas funções de usuário,
‫que serão autorizadas a interagir com este recurso.
‫Nesse caso, com a exclusão de um tour, ok?
‫Então, vamos definir este como admin.
‫Portanto, apenas para administradores.
‫Ok, agora estamos lidando com funções de usuário aqui.
‫Assim como o administrador.
‫E agora, não temos isso em nosso modelo de usuário.
‫E então vamos implementar isso rapidamente aqui.
‫Tudo bem.
‫Então, vamos fazer isso.
‫Na verdade, antes das coisas de senha, assim como aqui.
‫E aqui você pode realmente ver como nosso manipulador de
‫exceções não detectadas está funcionando bem,
‫porque strictTo ainda não é uma função, certo?
‫Não o implementamos ainda.
‫Eu simplesmente usei para mostrar o
‫que exatamente vamos construir.
‫E claro que há um
‫erro, e
‫então o nodemon está agora esperando que reiniciemos o servidor, certo?
‫De qualquer forma, o papel aqui deve
‫ser do tipo String, e agora vou usar o validador enum
‫para permitir que apenas certos tipos de papéis sejam especificados.
‫E esses são os usuários gerais, ou seja, os usuários normais, então
‫vamos chamá-los de usuário.
‫Então, temos o guia
‫turístico, temos o guia turístico
‫líder e temos o administrador.
‫Então, estou ligando para aquele administrador, certo?
‫E essas funções de usuário que temos aqui
‫certamente serão específicas ao domínio do aplicativo.
‫Então, por exemplo, quando você está administrando um site de
‫comunidade, não fará muito sentido
‫ter um guia e um guia principal.
‫Em vez disso, você provavelmente
‫terá moderadores ou contribuidores ou membros.
‫Portanto, você sempre terá nomes
‫diferentes, dependendo do tipo de aplicativo que está escrevendo.
‫Mas, no nosso caso, é isso que faz sentido.
‫Em seguida, também queremos definir um padrão aqui, de
‫modo que não tenhamos que especificar
‫sempre que tipo de usuário estamos criando.
‫E então o usuário, o usuário normal, digamos,
‫é aquele que será criado por padrão.
‫Portanto, vamos agora realmente
‫excluir os usuários que já
‫temos, porque eles
‫não têm nenhuma função e, portanto, não precisamos mais deles assim.
‫Tudo bem.
‫E então, vamos
‫prosseguir e criar alguns novos.
‫Então, vou me inscrever aqui como hello @
‫jonas, e agora esse será um usuário normal, e agora não conseguimos obter
‫nenhuma resposta, e isso
‫é claro porque temos esse erro aqui, e
‫então, vamos muito tire rapidamente essa linha de código.
‫E agora o erro desapareceu.
‫E agora ele deve
‫rodar, e de fato agora temos
‫esse usuário, com a função de usuário, ok?
‫Esse é o nosso
‫padrão, mas agora vamos criar um administrador aqui.
‫E para deixar
‫isso bem claro, vamos colocá-lo aqui no e-mail
‫também, e agora precisamos realmente especificar a
‫função e defini-la como admin.
‫Envie isso e agora temos aqui o nosso administrador de sistema.
‫Legal.
‫Então, vamos voltar aqui, colocar este código de volta, e agora faremos
‫isso de forma que possamos
‫realmente passar vários argumentos para este strictTo.
‫Portanto, quero que o administrador possa excluir os passeios,
‫mas também excluir um guia.
‫Tudo bem?
‫E então vamos adicionar isso aqui também.
‫OK?
‫Assim, o administrador e o guia líder agora podem
‫excluir passeios, mas não os guias normais e também não os usuários normais.
‫Tudo bem?
‫Então é assim que o strictTo vai
‫funcionar, vamos prosseguir e implementá-lo.
‫Portanto, as exportações. restrTo, e
‫agora, como vamos realmente implementar isso?
‫Porque normalmente, não podemos passar
‫argumentos para uma função de middleware, certo?
‫Mas, neste caso, realmente queremos.
‫Queremos repassar os
‫papéis, quem tem permissão para acessar o recurso, certo?
‫Portanto, neste caso, o administrador e o guia principal.
‫Portanto, precisamos basicamente passar argumentos para a função
‫de middleware de uma forma
‫que geralmente não funcione.
‫Então, como vamos fazer isso?
‫Bem, aqui, vamos realmente criar como uma
‫função de wrapper, que retornará
‫a função de middleware que realmente queremos criar, ok?
‫Portanto, esta é a função restrictedTo, e
‫aqui queremos passar
‫um número arbitrário de argumentos.
‫Então, basicamente, de papéis.
‫E então podemos usar a sintaxe do
‫parâmetro rest, que é nova no ES6, e
‫isso criará um
‫array de todos os argumentos que foram especificados, ok?
‫Portanto, estamos criando
‫essa função e, imediatamente, retornaremos uma nova função.
‫E esta é a própria função de middleware.
‫Então, solicitação, resposta e próximo.
‫OK?
‫Faz sentido?
‫E então essa função
‫aqui basicamente terá acesso ao parâmetro
‫dessa função aqui, porque há um encerramento, ok?
‫Assim, apenas como um comentário aqui para
‫explicar, funções são uma matriz.
‫Então, por exemplo, pode ser,
‫neste caso, administrador e guia de leads, certo?
‫Então, quando daremos a um usuário acesso a uma determinada rota?
‫Bem, basicamente, quando seu papel de
‫usuário está dentro desta matriz de papéis que passamos certo?
‫Digamos que agora tenhamos o usuário
‫normal, que tem a função de simplesmente usuário, então
‫vamos escrever aqui.
‫A função agora é apenas do usuário.
‫Basicamente, não está contido neste array
‫e, portanto, esse usuário não tem permissão, certo?
‫E então, vamos escrever isso em código.
‫Na verdade, é muito simples.
‫Então, se não papéis. inclui, e ok, mais uma
‫vez, includes é um método de array muito bom
‫que está disponível em Java Script em todos os arrays, ok?
‫Portanto, se esta matriz de funções
‫não inclui a função do
‫usuário atual, não damos permissão para esse usuário.
‫E onde está armazenada a função do usuário atual?
‫Bem, vamos lembrar a linha de código
‫que colocamos aqui, bem no
‫final, onde concedemos acesso à rota
‫protegida, armazenamos
‫o usuário atual na solicitação. do utilizador.
‫E lembre-se de como esse
‫middleware de proteção sempre é executado antes de strictTo, certo?
‫Então, aqui, primeiro temos proteger e,
‫em seguida, restringirTo.
‫E então, no momento em que esta função de middleware
‫aqui é executada, esta já foi
‫concluída e colocou o usuário atual no objeto de solicitação.
‫E agora, podemos usar isso aqui.
‫Então, peça. do utilizador. Função.
‫Então é aí que a função é armazenada.
‫Tão simples.
‫Nesse caso, criamos um novo erro.
‫Assim como antes, e agora
‫dizemos que você não tem permissão para realizar esta ação.
‫E agora um novo código de status, que é 403.
‫E este significa proibido, ok?
‫Portanto, há realmente
‫um código de status http específico
‫apenas para este caso, para autorização basicamente, certo?
‫E, bem, caso contrário, simplesmente ligamos em seguida.
‫E é isso mesmo.
‫Então é tão simples quanto é.
‫Então, vamos recapitular rapidamente o que acabamos de fazer aqui.
‫Portanto, aqui, primeiro executamos o middleware de proteção.
‫Em seguida, restrinja o middleware,
‫e somente se esses dois middlewares passarem para o
‫próximo, iremos para o tour principal.
‫E então, basicamente, este
‫manipulador de rota, ou este controlador de rota,
‫é protegido e também é restrito por
‫este middleware que acabamos de criar.
‫Então, para
‫esta função, passamos todas as
‫funções que têm permissão para interagir com este recurso.
‫Então, basicamente, quais têm permissão
‫para executar essa função de manipulador, certo?
‫E então, essa função restringirTo será
‫executada e retornará a própria função de middleware, certo?
‫E essa função de middleware em si é realmente esta.
‫Então, por causa
‫do encerramento, terá acesso aos papéis, ok?
‫E então, digamos que a função do usuário atual, que
‫é, lembre-se, armazenada em req. do utilizador. papel, certo?
‫Então, digamos que sua função seja
‫usuário e, como essa função não está no
‫array desta função, bem, obteremos este erro, certo?
‫E é assim que funciona. inclui testes aqui para, ok?
‫Mas é claro que, se
‫estiver incluído, passaremos para o próximo middleware.
‫Que, novamente, é o próprio manipulador de rota.
‫Legal.
‫Então, espero que faça sentido.
‫Vamos agora testar isso rapidamente.
‫OK?
‫Então, agora, temos
‫esse token aqui, armazenado na variável JTW, certo?
‫Portanto, lembre-se disso na última aula.
‫Então, estamos neste ambiente
‫de desenvolvimento e aqui está essa variável.
‫Então, exatamente aquele que está aqui embaixo.
‫Tudo bem?
‫Portanto, se agora quiséssemos
‫excluir um passeio, teríamos que especificar essa variável lá, certo?
‫Então, vamos para a autorização, o token
‫do portador, e ele
‫já o coloca aqui para nós.
‫Então ele já sabe
‫que é esse que a gente quer usar,
‫porque, bom, já usamos antes, ok?
‫Agora, quero começar mostrando que
‫um usuário comum não pode excluir um tour agora, certo?
‫E então vamos começar fazendo login como um usuário regular.
‫E isso é oi, certo?
‫Lembre-se, agora temos hello @ jonas. io, que é um usuário normal, e
‫temos admin @ jonas. Io.
‫E ainda temos este antigo aqui, vamos nos livrar dele.
‫Tudo bem.
‫E então vou começar com hello @ jonas. Io.
‫OK?
‫Então, logando, esse token será armazenado na variável de
‫ambiente, e agora estamos prontos
‫para deletar um tour.
‫Na verdade, também precisamos obter um ID agora,
‫então vamos pegar um rapidamente daqui,
‫então vamos basicamente deletar um de nossos tours aqui.
‫Então, vamos usar o último aqui.
‫Então, o observador de estrelas.
‫OK?
‫E vamos ver se recebemos nossa mensagem de erro.
‫E, de fato, você não tem permissão para
‫realizar esta ação.
‫Então, 403.
‫Então, de fato, está funcionando, certo?
‫Mas, para
‫completar agora, vamos logar como administrador.
‫Então, administrador.
‫Conecte-se.
‫E então este token agora está armazenado nesta variável.
‫Portanto, se você
‫executar isso agora, poderemos excluir o passeio de forma eficaz.
‫Quero ver?
‫E se foi.
‫Portanto, temos um código de 204, sem conteúdo,
‫que é o padrão ao excluir,
‫mas agora se conseguirmos todos os
‫nossos passeios, agora devemos ver um número oito aqui,
‫portanto, apenas oito
‫resultados, e isso significa que o último agora é se foi, ok?
‫E agora, como acabamos de
‫provar, um administrador tem
‫permissão para excluir efetivamente os passeios, certo?
‫E, eu realmente não posso enfatizar o
‫suficiente o quão importante é este trecho de código aqui.
‫Então, basicamente, de onde tiramos a função do
‫usuário atual do middleware antes, certo?
‫Portanto, armazenar o usuário na solicitação como fizemos
‫aqui é realmente crucial
‫para que a próxima etapa realmente funcione, certo?
‫Portanto, o ID que é codificado no token da web Jason é o que
‫faz nosso código saber se o usuário que
‫está tentando executar a ação é um usuário, ou se é um administrador,
‫ou se é um guia de chumbo, ou o que quer que seja.
‫Novamente, porque esses
‫dados vêm desse middleware de proteção.
‫Excelente.
‫Essa foi mais uma peça importante do quebra-cabeça
‫na implementação de nosso fluxo de trabalho de autenticação aqui.
‫E claro, você quer restringir
‫várias outras rotas, por exemplo, atualizar aqui, ok?
‫Mas vou deixar isso para
‫um ponto posterior do curso, ok?
‫Bem aqui, eu só queria
‫mostrar como tudo isso funciona, ok?
‫Então, acho que fiz isso com sucesso.
‫Espero que você tenha entendido como isso funcionava e,
‫claro, se não, você sempre pode fazer uma pergunta
‫na seção oficial de perguntas e respostas.
‫De qualquer forma, há mais conteúdo excelente chegando agora e então,
‫vamos seguir em frente.