você pode se inscrever na imersão ó Se inscreva aí na imersão se você ainda não está inscrito ó esse link que tá aí no chat tá não perca essa oportunidade porque na semana que vem nós vamos construir essa gate de pagamentos usando todas essas tecnologias que nós vamos passar aqui durante a semana Então você que está já vendo eh essas lives você vai conseguir absorver muito mais tá então fique ligado nisso Na semana que vem não só a construção desse gate de pagamento mas nós vamos ter lives à noite Eh tem grupo no Discord também
que você entra ali com a nossa comunidade e você vai praticando os exemplos dos vídeos vai tirando dúvidas e tal A gente fica lá também conversando com vocês é muito legal Então não deixe de se inscrever mesmo Beleza deixa eu dar boa noite aqui pra galera Ó Roberto Carlos já tinha dado ali um OK às 4:45 da tarde Eu tenho motivado o Valder Loiola Rosenira Surda eh o Davi Silva o Eger Valezim aí sempre aí com a gente também acompanhando os nossos conteúdos Inclusive pessoal deixa eu saber aí quem é novato quem é novata Coloque
#nvato novata ou veterano ou veterana Se você eh é aluno nosso tem alguma formação nossa coloquea aí também #veterana ou veterana só para eu ter ideia Ó o Pedro Henrique também tá aí Boa noite Cleon Rodriguez Mateus Linhares William Peixoto Alexandro Toledo Sérgio Long eh Joe Gama Vittor Valente Eric Moreira Rodrigo Siqueira quem mais aldo Costa Leandro Santiago Ton Mourinho User eh José Francisco Edson Bezerra Vinícius Becalete André Ferreira Isso aí pessoal Boa noite para todo mundo que tá chegando Ó deixa eu ver aqui ó A Audre Avalos é novata seja bem-vinda ao José Francisco
Mande um salve pros dinossauros do Acre Então mande um salve aí para vocês estão mandando um salve para todo mundo que tá aí no Acre já Inclusive eu nunca fui no Acre mas estive bem perto que é em Rondônia Ó o Franklin Mendes é novato Newton da Crosse Carlos Adriano Marcelo Santos Ó o Rafael Pereira é veterano né sempre acompanha aqui Eu vi que ele tava eu tava acompanhando a live do Wesley ontem vi também que o Rafael tava aí sempre com a gente também Muito bom Também convido vocês a fazer parte da nossa comunidade
Eh convido a se inscrever no canal ativar o sininho das notificações para que você não perca nenhum conteúdo novo Não só os eventos mas toda semana a gente publica conteúdos novos aqui no canal Full Cycle Para quem não conhece a Full Cycle é uma instituição de ensino que tem pós-graduação tem MBA tem o curso Full Cycle 4.0 também que muita gente conhece e nós temos esse canal no YouTube então você acompanhando a gente não vai perder nenhum conteúdo E tem o nosso Instagram também não deixa de seguir a gente lá Eh @devfycle muito importante também
sempre a gente posta stories sobre o nosso trabalho novidades da área de tecnologia eh e mais um monte de outras coisas também Não deixe de seguir a gente lá Eh deixa eu dar uma olhada que o pessoal normalmente não dá o like né é o puxãozinho de orelha A gente tá ó com 235 pessoas 235 pessoas Tá aqui o Instagram 235 pessoas assistindo e apenas 72 likes pessoal A gente merece com certeza Não vai custar nada o dedo não cai mas nos ajuda bastante porque o YouTube entende que as pessoas estão curtindo e espalha esse
conteúdo para mais pessoas que é isso que a gente quer tá nos ajude a crescer Ao Pedro Henrique aí Luiz vai me dar uma aula no MBA pô Com certeza Deixa eu ver o que mais que vocês estão mandando aqui Tem gente no Pará o Walder Loiola tá lá em Marabá no Pará Então tá ali na região do José Francisco né ó tem gente veterano ó Lucas Gabriel muita gente acompanha já o nosso canal vem aqui para poder participar dos eventos também Ana Carolina tá na Paraíba Eh imagino que às vezes chega que algumas pessoas
eh da Europa da Ásia da África da América do Norte enfim a gente tem público aí para para todo mundo tá mas show de bola pessoal Deixa eu me apresentar né para quem não me conhece meu nome é Luiz Carlos Eu vou até tirar aqui ó Se você quiser me seguir nas redes sociais é @argentinaloiza Ó meu dedinho tá para cá Eu sou City hoje dentro da Full Cycle e também professor das formações que a gente tem Já tenho quase 20 anos tô chegando a 20 anos tô acho que às vezes eu reduzo para não
parecer que eu não sou eh novo mas também não sou velho né eu tô ali na faixa dos 30 e tantos né não não é 30 e poucos mais mas já trabalhei com bastante coisas nessa área de tecnologia inclusive manutenção de computadores já tive uma empresa para isso eu tive minha software house prestei consultoria enfim e hoje tô aí nessa área educacional que eu sempre curti na verdade é sempre foi uma habilidade que eu tive desde mais novo né e já tive experiência com muitas linguagens de programação muitas ferramentas Eu curto ter esse momento aí
com vocês tentar passar um pouquinho da minha experiência para poder ajudar a comunidade e dessa parte que eu já ministro aulas eh à distância já vai fazer quase 12 anos Então tem sido bem bacana essa experiência Espero que vocês curtam a live aqui comigo então fico aí à disposição Vocês podem me adicionar LinkedIn Twitter GitHub eh Instagram é tudo @argentinaloiz né só a título de curiosidade eh eu fiz sistemas de informação sou MVP Microsoft e Docker Capton também tá já tenho uns bons calejamentos aí da área Já não tive um barnout mas já sofri coisas
que todos os profissionais sofrem mas a gente tem que saber jogar o jogo né show de bola Deixa eu ver o que que vocês estão falando mais aqui no chat A gente mandou o WhatsApp para pessoal que deve est entrando agora A gente aumentou ali para 266 pessoas É isso aí ó Igual a Aldre Avalos falou ali ó Sento o dedido no like não custa nada né de graça E espero que vocês sigam a gente aqui no canal se inscreva ative o sininho das notificações É eh o intuito da Full Cycle é formar profissionais para
poder ser de fato especializados no mercado para poder lidar com aplicações de grande porte trabalhar com grandes empresas serem profissionais de fato gabaritados Nós somos especialistas nisso Então eh só se só de você tá acompanhando aqui o canal você já vai ver o nível de conteúdo que a gente tem tá eh deixa eu ver que mais que vocês estão falando aqui Queria perguntar a vocês aí também sobre a gente tá ontem o Wesley falou bastante sobre IA né eh o que que vocês estão usando se vocês estão usando apenas chat EPT tá usando CILot tá
usando Cursal Dev in e Vzero da Versel Bolt new lá da Stack Blades Que que vocês estão usando aí quero saber Eh só a título de curiosidade mesmo pra gente poder bater mais um papo enquanto mais pessoas entram Eh a gente não vai eh falar exatamente hoje de A mas na sexta-feira vai ter a live de Next que aí sim a gente vai usar bastante a para poder montar ali o nosso frontend que é mais eh um dos assuntos aí que vai ter nessa gate de pagamentos [Música] Hã ó o Pedro falando ali que vocês
podiam comercializar esses cursos da imersão que vocês fazem Fui fazer a imersão passada meio atrasada não deu tempo Então eh não é o nosso objetivo fazer essa comercialização porque por exemplo essas esses esquentas aqui eles ficam aí no canal né então lembrando eh se você não conseguiu acompanhar as live a live de ontem não consegui acompanhar toda a de hoje ou enfim não consegui acompanhar a semana vai ficar tudo gravado no canal Vou até deixar isso aqui porque depois as pessoas vêm ficam tranquilas Então todas as lives ficam no canal mas os vídeos do gate
de pagamento eles começam a ser soltados ali no dia 7 a 14 de abril né e eles ficam até o dia 14 dá na segunda eles ficam até segunda-feira à noite depois eles são removidos e eh vão lá pros alunos do curso Full Cycle tá exatamente Só do curso Full Cycle Nós temos pós-graduação em BBA não vai para essas formações Então fique ligado né então essas lives aqui pode ficar tranquilo que a gente não tira já os vídeos Sim à ó o Luciano Amaral tem capitão Poó do Pará Tem gente aqui do Brasil então na
verdade tem muitas pessoas aqui do norte pessoal tá usando Deixa eu ver ó Deepsic na aveia chat EPT e copilot eh cursor VS code copilot cloud Vzero eh GPT depsic [Música] Hã ó o Rafael tá estudando prompt engineer É tem muita gente usando aqui o GPT né gpt acho que o que mais tá se utilizando aqui é copilot GPT de psíquica até eu tô achando curioso que tem muitas pessoas utilizando E depois o cursor pelo que eu vejo aqui junto com um cloud né que é um modelo tem isso muito utilizado aí para programação Show
de bola pessoal Maravilha pessoal Então vamos lá Eh eu quero compartilhar a tela com vocês aqui paraa gente poder começar a nossa aula né eh hoje a gente vai ter muita codificação Vamos codificar eh eh na mão mesmo não vai ter IA na verdade como eu falei na sexta-feira nós vamos trabalhar mais com e o objetivo hoje é mostrar uma API REST construída com esse framework NJS em que nós adicionamos ali uma auto indicação com tokens JWT e nós vamos trabalhar também com autorização Eh nós vamos trabalhar com alguns modelos Eh esse conhecimento ele é
muito importante Eh nós não vamos ter especificamente autenticação e autorização na imersão mas nós vamos usar o Nest como framework ali para poder desenvolver a arquitetura do nosso projeto Ele vai acabar sendo um consumidor do CAFCA que é outra ferramenta também que nós vamos ter conteúdo aqui que vai ser amanhã Então ele vai consumindo ali as novas invoices as faturas que vão chegando e vai processando antifraude né então eh o Nest inclusive é um dos conteúdos que a gente mais ministra aqui no canal não só na imersão mas também de vídeos convencionais Talvez a gente
seja o canal que mais tem conteúdo de Nests no Brasil porque eh se você tá escolhendo um framework node js para poder resolver os seus problemas e ainda trabalhar com uma arquitetura mais complexa utilizando microsserviços NJS é uma boa escolha é porque ele já tem suporte a integração com vários meios de comunicação eh e também permite que você crie uma arquitetura modular Então é um framework muito bacana ele é muito diferenciado de outros frameworks São muitas possibilidades existentes né ele já foi criado ele foi criado em 2017 então a gente tá indo aí pro oitavo
ano desse framework que recentemente lançou a versão 11 tá esse é o nosso objetivo da live Então eh só quero deixar algo ponderado aqui porque eu sei que tem muitas pessoas que são novatas né estão vendo aqui o primeiro conteúdo A gente tá aqui exatamente na semana do esquenta Nós não estamos ainda na imersão full cycle A gente chama de esquenta da imersão que ela precede o evento Nós mostramos eh todas as tecnologias que vão ser usadas paraa construção do nosso estudo de caso que é esse gate de pagamento A imersão mesmo vai acontecer do
dia 7 a 14 de abril Espero que todos vocês estejam inscritos aí através do link que está na descrição tá eu queria deixar isso aí bem claro Então pra gente poder trabalhar com o Nest eh eu não vou usar Docker aqui exatamente para ele Se sobrar um tempo no final da live a gente pode até dockerizar a aplicação Node Mas nós vamos usar Docker para poder subir o banco de dados que vai conectar ali na nessa API R que nós vamos criar Então eh tem que ter o Node instalado na máquina Coloca um asterisco pro
caso do Windows Eh espero que você teste pelo menos o WSL né na agora no Windows consegue rodar um Linux que é virtualizado mas é muito veloz Então vou até deixar o link aqui do nosso tutorial Esse aqui é o melhor tutorial que você vai encontrar na internet sobre o WSL Ele vai te falar tudo aqui Olha só o glossário né a gente vem mantendo esse tutorial já há 4 anos você vai encontrar todas as informações desse como instalar esse WSL também como configurar o Docker e tudo mais Você vai ter uma outra experiência no
Windows Então eh para poder fazer a instalação a gente pode fazer instalação aqui via command né no caso então do Windows você selecionaria aqui Linux E aí pode instalar aí via NVM né que inclusive você pode ter várias versões do Node na sua máquina Então para Linux a mesma coisa E no caso do Mac também dá para instalar com esse NVM tá é assim que seria a instalação hoje mais direta aí do Node Aqui tá a página do Framework Eh esse gato aqui né essa parece um lince ou algo assim uma onça mas na verdade
é um gatinho A documentação do framework é muito fácil de entender São muitos exemplos muitas vezes apontando pro repositório do próprio Nest também tem uma comunidade no Discord eu participo lá quando às vezes eu eh quero tirar alguma dúvida o pessoal também é muito ativo mas também dentro do GitHub você consegue lá no fórum eh do próprio repositório tirar suas dúvidas né então a gente vê aqui pela forma que é tudo dividido é muito fácil né você consegue ter eh os fundamentos quiser trabalhar com graphic segurança que vai ser o assunto hoje da live microservices
enfim Eh eu curto bastante a trabalhar com esse framework Inclusive vou falar uma coisa Eh quando esse framework não era nem hype ainda era ali em 2000 início de 2019 tinha apenas 2 anos que ele tinha sido lançado Eu fui das primeiras pessoas no Brasil a começar a levar esse conteúdo porque e de Nest porque eu vi que esse framework tinha futuro Então eu fiz uma aposta ali falei: "Poxa na hora que eu olhei eh esse framework ele tem eh eh tudo para ser o dos principais frameworks da comunidade Node para construção de aplicações web
né então é um dos frameworks mais hypados que a gente tem aí no momento É uma ótima escolha mesmo se você tiver criando a sua aplicação web Beleza então vou fazer o seguinte aqui Eu vou voltar paraa minha tela eh e eu vou compartilhar o meu terminal E vocês vão me ver agora aqui no cantinho ó Tá tô aqui ó aqui em cima Vou tirar o meu nome dali para poder ficar mais fácil para mim Eh aqui Pronto Então vamos começar a nossa brincadeira aqui Eu tô com Node se eu não me engano versão 23
Minha versão tá até eh bem atual A gente tem que fazer uma instalação global do pacote de CLI dele para poder fazer a execução de comandos Então eu posso fazer aqui um nest vai me dar a opção de várias coisas vai ser o seu melhor amigo Ele cria artefatos ali Então nós podemos criar serviços providers módulos midors eh gateways que não tem nada a ver com gate de de pagamento né filteres e tudo mais Então a gente vai fazer um Nest New Nests pode ser Alf tá até aqui na minha memória que não é a
primeira aplicação que eu estou criando Aí ele vai me perguntar qual gerenciador de pacotes que eu quero trabalhar e ele vai criar um projeto que só tem esses arquivos aqui Se a gente for pensar excluindo aqui ó package Jon arquivo de configuração do Typescript que é o que se trabalha por padrão eh a gente tem uns quatro arquivos aqui só do projeto Então assim ele começa bem pequeno você pode construir uma aplicação bem minimalista mas crescer o seu projeto muito bem Eh o Nest sempre trabalha com módulos a gente vai ver daqui a pouco Então
permite que a gente vai organizando tudo nesses módulos eles vão se conversando Você pode reusar as coisas de um módulo e até transportar algo de um módulo para uma outra aplicação Então o framework vai tomar sérias eh eh decisões ali que você às vezes teria suas dúvidas em tomar vai tomando às vezes determinados padrões erráticos durante o projeto então você não tem que se preocupar com isso Então vamos abrir aqui com o VS Code Tá aqui o nosso projeto Então vamos fazer aqui o npm run start dev Rodando aqui com npm para poder liberar a
IPI na porta 3.000 E pior que eu tenho alguma outra coisa aqui na porta 3.000 Olha só Vamos fazer aqui um NPX port 3.000 Isso aqui é um executável para poder matar algo que tá na porta Provavelmente eu tinha uma outra aplicação que eu tava rodando aqui Pronto Eh ainda eu tenho alguma outra coisa rodando Pera aí Acho que eu tô com Docker aqui Isso aqui é coisa da imersão hein tava rodando antes É aqui por causa que eu tô rodando o next eh com Docker então ele não libera a porta 3.000 de forma alguma
Deixa eu parar esses dois contêiners aqui com o Docker para poder me liberar aqui Pronto Então ele tem que dar essa mensagenzinha aqui Aí eu posso vir aqui no browser e rodar um local host na porta 3.000 Tá aí o Hello Word Não temos nenhuma página de boas-vindas ou algo assim Então temos a nossa nosso primeiro Hello Word aqui Eh temos vários arquivos de projeto não precisamos preocupar com isso como o package JSON que organiza aí o o start dev que que vai rodar o modo de desenvolvimento né tudo que a gente vai fazendo ele
vai recompilando o projeto porque ele transforma o Typesc para JavaScript para poder servir a aplicação com Node então essa aqui é a pasta que ele tá servindo né aí tem a Node modos lá com um monte de bibliotecas embutidas Está aqui a nossa pasta seceing né que é onde nós vamos desenvolver o nosso projeto O main Teste é onde inicia a nossa aplicação Então essa função Bootstrap aqui ela vai fazer o start aí e colocar um bind ali na porta 3.000 para poder servir as solicitações Esse Next Factory recebe um módulo para poder criar a
instância da aplicação E aqui é passado a porta 3000 se eu não passar a variável de ambiente Então esse app mod é um módulo Lembra que eu falei né tudo no nest vai ficar no módulo não tenho o que fazer né o módulo na verdade vai ser uma classe que tem esse decorator aqui em cima que é um padrão do JavaScript né padrão da ECMA Script que a gente chama de S7 que eu são essas funçõezinhas que eu coloco @ Então ele está decorando essa classe tornando ela um decorator E aqui então nesse decorator estou
registrando todos os artefatos para fazer parte desse módulo Só vai funcionar algo no Nest se tiver registrado dentro de um módulo Então eu tenho aqui um controller que ele acaba trabalhando ali com arquitetura MVC e um serviço tá então vamos dar uma olhada no controller Olha só também acaba sendo outro decorator Então é para quem tá vendo aí do Java eu quando eu faço essas lives aqui eh eu costumo ver muitos comentários né poxa parece bastante com Java realmente com Spring né quem vem aí do Spring é mais ou menos dessa forma aqui Então isso
aqui torna essa classe um controller e através dos decorators que eu tenho aqui get post correspondentes aos verbos http nós criamos as rotas Então aquela rota raiz é liberada através desse get aqui E aí nós temos o serviço sendo chamado O serviço é algo que eu vou processar normalmente pode ser ali as minhas regras de negócio Eh eu já tenho uma camada separada para isso É muito fácil lidar Então o serviço ele tem também outro decorator mas aí é chamado de injectable né porque o serviço ele pode ser injetado em outros serviços também Então tudo
fica registrado no módulo porque aí o Nest ele sabe injetar tudo A gente vê aqui que não tem nenhum lugar nessa aplicação porque a aplicação só tem quatro arquivos Não tem nenhum lugar que a gente tá fazendo um new app controller A gente não precisou se preocupar com isso e passar aqui o app service tudo tá registrado no Nest ele sabe resolver tudo Então basta que você coloque no construtor Tem outras formas também de injetar as dependências e as coisas já vão acontecendo né então é assim que a gente vai desenvolvendo Vamos pensar aqui agora
eh em começar a criar essa nossa aplicação de autenticação Qual que é a primeira coisa que eu preciso de ter para autenticar um usuário vai ganhar 0 0,001 Bitcoin Quem responder primeiro que que eu preciso ter é Java raiz mesmo como o Rai da Costa ali falou Que que eu preciso de ter para poder autenticar o usuário não o B Não banco banco com certeza né eu preciso de um de usuários né eu preciso de usuários Vou precisar de usuários porque vai ter que ter um e-mail uma senha pelo menos para poder fazer uma autenticação
Então vamos fazer o seguinte aqui ó Eh a gente pode chegar e fazer assim ó nest generate ou apenas de controller users por exemplo Então ele vai gerar um controller aqui ó já com esse decorator com esse users aqui Isso aqui é seria o prefixo das minhas rotas mas vamos pensar que eu preciso muito mais que isso preciso de controller vou precisar de serviço vou precisar de entidade enfim vou precisar de uma estrutura Então é bom a gente criar um módulo Então vou remover esse controller daqui ó Inclusive quando ele cria ele vai lá e
registra no app mod Tá vendo então esse Nest ele é um melhor amigo O que que a gente vai fazer então nós vamos na verdade rodar aqui um comando mágico Vai ser o Nest de Resource Aí ele vai me perguntar qual que é o nome do seu recurso Inclusive até colocar como exemplo ali users né aí vou marcar aqui como rest e quero que ele crie todos os eh entry points do clude né ele vai criar um clude completo Então ele vai acabar gerando vários arquivos Então ele acaba gerando aqui pra gente um módulo já
de users mod Então a gente vai colocar tudo de users aqui um controller e um serviço dentro do controller Isso aqui é muito legal porque ele gera todas as rotas já com as boas práticas de uma API rest Então aqui com o verbo post ó seria barra users para poder fazer a criação Se eu quiser pegar todos os usuários eu faço um get pra barra users Se eu quiser pegar apenas um usuário eu passo um parâmetro de rota Então esse ID aqui é um parâmetro de rota que a gente captura também com decorator Tudo é
decorator né se eu quiser fazer a atualização ele já tá usando o patch em vez do que é um um verbo mais flexível né porque eu não sou obrigado a passar todas as informações do usuário E tem o delete também mas ele acaba gerando um serviço que já tá sendo injetado aqui porque eh ele tá registrado também no módulo né e esse serviço já tá bonitinho pra gente entrar e fazer as nossas regras de negócio Ele não gerou ainda banco de dados nem nada né mas já tem ó create find find one update remove Então
já tá no jeito aqui pra gente poder fazer a nossa lógica tá então vamos fazer o seguinte aqui Eu quero colocar eh um banco de dados Eu não vou instalar banco de dados nem nada nem tem banco de dados na verdade instalado na minha máquina tudo com Docker A gente vai criar um arquivo aqui chamado de Docker Compose em eu vou jogar essas instruções aqui Não precisa decorar isso né o Wesley foi mostrando isso Se você não tem experiência com doc você vai pegando o jeito conforme eh você vai mexendo Então isso aqui significa que
eu vou levantar um contêiner chamado de DB que vai ser um post grass em que nós vamos ter um db chamado de myb com uma senha para o usuário Postbrash que é o usuário padrão lá do Postbrast que vai chamar Rot Ele tá liberado aqui na minha máquina na porta 5432 batendo na do containers que é o bind que também é 5432 Então eu já consigo liberar um postgress aqui bonitão né então vou rodar aqui o comando Deixa eu só rodar um D para ver se eu não tenho nenhum postbess criado E eu tô rodando
aqui com Docker Desktop né que é uma também uma forma bem eficiente de você rodar o Docker Tem outras formas também não tem nenhum container então vou fazer um docker compose up Ele vai subir o banco de dados Gabriel Miranda pergunta se eu tô usando o VS Code Insider Sim né você deve ter visto aqui no cantinho Sim eu tô usando o Insider porque ele eh eu comecei a pegar as últimasções de a que a Microsoft tem liberado só tem liberado pro Insider Então já tem algumas mudanças bem bacana Eh assim o Insider ele é
complicado porque todo dia tem update no VS Code não é igual a versão estável que é mensal Então eh você liga o computador vai aparecer aqui em cima nova atualização e você não sabe meio que pode acontecer né porque às vezes ela pode zicar pode deixar de funcionar aí o copilot alguma outra coisa Então vira meio que uma roleta russa mas é e é e tem sido legal E e os erros na verdade que eu passei com Insider são muito poucos Então ele já tá aceitando aqui as conexões Beleza vou deixar esse terminalzinho aberto aqui
ó Vou colocar como eh postras aqui rodando E agora para poder organizar essa questão de fazer o Nest acessar o banco de dados nós vamos usar o Prisma ORM Quem aí conhece esse cara prisma ORM é um dos ORMs mais famosos da comunidade node Ele tem uma proposta bem diferente né você não cria ali as entidades de forma convencional você acaba fazendo um arquivo diferenciado ali com esquema com todas essas entidades né então vamos fazer aqui o NPX Prisma Imit Isso aqui vai gerar um projeto do Prisma dentro do nosso projeto Então ele vai gerar
aqui um ENV que vai ser a variável de ambiente para ele poder conectar no banco Já vem aqui com pegas é só a gente mudar as credenciais e gera a pasta do Prisma onde nós modelar os nossos dados Então aqui no ENV eu vou colocar aqui eh postegers e routinciais do banco Local host na porta 5432 My DB já tá e o esquema public então já tá do jeito que a gente precisa certo eh eu tenho que fazer outra coisa aqui que é instalar o pacote do Prisma dentro do meu projeto lpx @prisma/cent senão o
Nest não vai se conectar E pra gente poder fazer a modelagem agora de usuários nós vamos usar esse arquivo que é onde o Prisma entende ele faz ali a a tradução né da nossa aplicação pro banco do banco paraa aplicação Para que a gente tenha esse syntax highlight aqui é necessário que você instale a extensão do Prisma no VS Code Inclusive eu até não falei de extensões pro Nest no V Code tem muita extensão você pode colocar aí o S link e o prurer o Slint ali que fica analisando seu código né vendo algumas coisas
erradas que você tá fazendo e o pror para poder fazer alinhamento mais nada além disso tá eh show de bola Então vamos chegar aqui Ele já tá com póstras eu já coloquei tudo na variável de ambiente Então para poder criar a nossa tabela de usuários eu vou chamar aqui ó tá iá tá até me dando uma sugestão Eu vou aceitar a sugestão dela a gente modifica o que for necessário Esse módel uma tabela do banco Então eu vou ter um usuário com um ID que vai ser uma chave primária Isso aqui torna ele uma chave
primária Esse @ID e o default poderia colocar um ID auto incrementado ou esse se ID aqui que vai ser um hash que o próprio Prisma acaba gerando aqui Não não importo com isso usuário vai ter nome mas eu vou tirar essa interrogação Essa interrogação significa que o campo é nulable tá então nome vai ser obrigatório e-mail vai ser obrigatório e obviamente tem que ser único não posso ter registro de usuário repetido O peço hoje também obrigatório Eh data de criação e atualização isso aqui ele já gera de forma automática também É legal Quando eu coloco
esse default now e esse updated ad então ele já gera a data de criação do registro no momento que eu tô criando Quando atualizar ele também já faz a data de atualização ali pra gente Mas algo que eu quero acrescentar aqui vão ser as roles né eh a gente vai trabalhar com papel de usuário A ideia é que a gente crie uma IPI bem simples que vai administrar posts né e apesar dela ser simples a gente vai focar mais na autenticação e na autorização Então eu posso criar aqui na verdade ã um enum rol disponíveis
E aí eu quero uma um papel de admin um papel de leitor editor de escritor que já tá bom Acho que esses papéis aqui já dá pra gente poder brincar Então eu falo que esse rollers aqui vai ser desse tipo porque ele fica tipado inclusive lá no póst eu não posso colocar em outro valor E o default vai ser reader porque se alguém esquecer de passar a roll do usuário né não vai ter o risco ali de que tá colocando um admin ou algo assim Então é bom colocar o nível mais baixo né aqui de
que um reader da vida não teria permissões de fazer nada tá show de bola Então depois de ter definido isso aqui agora nós vamos gerar o SQL para poder criar a tabela Então eu faço NPX Prisma migrate Dev Aí ele vai perguntar aqui o nome da migração Não quero dar nada ele cria um nome aleatório Ele já cria a migração e executa ela para mim Então olha só a migração que tem aqui ó Ele criou inclusive um tipo lá no póstoles E aqui é a minha tabela de usuário Ela já tá presente no pwers não
preciso fazer nada Então ele já tem um sistema de migração Você vai mudando o banco de dados À medida que você vai eh mudando o seu esquema quando você roda esse comando aqui ele identifica as mudanças do esquema com o banco Então é um ORM bem versátil né beleza agora a gente vai ter que criar aqui um Nest Generate module Prisma para que a gente faça o Nest se comunicar com o Prisma Então tá aqui um módulo dele e vou criar um serviço para que a gente possa organizar a questão aqui do banco de dados
Então vai ser assim ó Nesse serviço ele vai estender lembra daquele Prisma client que a gente tinha instalado anteriormente ele vai estender desse Prisma client e essa instância que vai eh ler do banco de dados vai fazer todas as operações Sempre a gente vai usar ela e aqui em todo lugar Eu já quero que quando a minha aplicação Nest inicie ela já se conecte no banco de dados Então eu vou permitir que ela implemente aqui uma interface do Nest chamado de On mod init Essa interface vai me permitir implementar esse método aqui Então quando o
módulo do Prisma estiver iniciando nós vamos chamar a função connect do Prisma client Então a gente vai estar conectado no banco de dados tá como esse serviço já está registrado aqui nesse módulo e esse módulo já está registrado aqui nós já podemos usar na parte de usuário Vamos fazer aqui na parte do user service a importação do Prisma Service Prisma Service E eu vou rodar a minha aplicação depois de alguns minutos sem rodar né vamos ver o que que vai acontecer Ele vai mostrar um erro em relação a esse Prisma Service Isso aqui é importante
de entender como que o Nash trabalha porque ele tá falando assim: "Olha eh eu tô tentando aqui iniciar o user service mas tem uma dependência que eu não consegui resolver." Ele coloca essa interrogação Ele tá falando: "Olha esse Prisma Service aí eh ele é um provedor ele faz parte do user mod Eh enfim ele tá dando aqui algumas dicas de como que a gente pode resolver Eh a gente tem que entender que um módulo não pode diretamente usar as coisas de outro módulo do Nest não é livre Tudo que você coloca na verdade no módulo
a princípio ela é privada Então aqui em providers eu tenho que colocar aqui exports com o Prisma Service para poder fazer a exportação dele Mas mesmo assim ó vou dar um save de novo Mesmo assim ainda não resolve o problema Por quê mesmo que eles estejam registrados no meu módulo raiz que é o app mod que a gente chama de módulo raiz que ele tá iniciando a aplicação esses dois módulos não se conhecem Então para que eu use aqui dentro dessa aplicação eu teria que usá-lo aqui teria que colocá-lo aqui o que não faz sentido
por banco de dados vai ser algo global paraa minha aplicação certo então esse user service vai usar daqui a pouco a gente vai ter a parte dos posts Então na verdade eh eu posso pegar algo de um módulo e tornar global Então eu coloco aqui @global e agora eu não preciso importar esse módulo mais em nenhum lugar eu preciso importar apenas no app mod Então a gente já vai ver que a nossa aplicação agora aqui tá com sucesso tá vendo então esse conhecimento aqui entender como que é a dinâmica dos módulos às vezes você cria
um módulo para poder ficar sendo reimportado nos outros lugares Às vezes faz sentido de que você tem um módulo que é global Ah deixa eu ver o que que vocês estão falando aqui só para poder acompanhar o chat Deixa eu ver se tem alguma coisa Gente falando Prisma Show Ó a Debrinha tá falando que é o primeiro contato dela com o Prisma Tá gostando Show de bola Maravilha Então agora nós vamos aqui paraa parte de usuários né pra gente poder fazer a nossa regra de negócio para poder criar essa autenticação Vamos abrir aqui o user
service ó Eh tá vendo que a gente recebe aqui um DTO na hora de fazer a criação esse DTO ele também tá sendo recebido pelo controller Esse @bor faz o Nest pegar o Borry da request extrair as informações e já converter para um objeto JavaScript Ele coloca nessa classe que tá aqui ó Então eu tenho o DTO O DTO é o data transfer object objeto de transferência de dados É um objeto que não tem eh camada de negócio ele só tem dados não tem lógica nenhuma dentro dele Serve pra gente poder colocar dados e ficar
transmitindo entre as camadas aqui do nosso projeto né então um DTO no Nest ele permite que a gente delimite todas as variáveis que a gente quer receber Eu quero receber o nome quero receber o e-mail quero receber o password quero receber a role Mas só que a roy né ela não é uma string Tem como a gente pegar o tipo do prisma como tá aqui de roles tem Então eu vou digitar aqui ó rolles Tá vendo de onde que ela vai vir o prisma ele é um ORM diferente porque normalmente os ORMs você define o
seu objeto relacional você define o seu mapeamento mas eh o Prisma ele compila tudo ele não fica aqui no próprio projeto ele acaba ficando na node mods ele fica aqui ó tá se a gente acessar aqui todo o código ele fica presente aqui Então se eu até ir para cá ó tá vendo ele criou aqui uma constante como tipo para tudo que a gente tem Então beleza Eh show de bola Então como que a gente faz aqui a criação disprismaservice.ususer A medida que eu vou colocando models dentro lá do meu esquema eu vou ter aqui
daqui a pouco post user e product o que eu quiser Então coloco user pate aí eu passo os dados que vai ser exatamente igual ao meu DTO Porém eu tenho que tomar cuidado né porque aqui a gente tá falando de autenticação Eu tô recebendo o password limpo aqui mas eu tenho que fazer uma criptografia dele Vamos usar a biblioteca BCPT para poder fazer a criptografia Então eu vou fazer a instalação do BCPT da tipagem que é separado É porque às vezes algumas libsí no node elas não vem a tipagem na própria lib Deixa eu só
ver se ele instalou de forma correta aqui ó O BCPT tá aqui e a tipagem dele tá aqui Então a gente vai importar aqui o Bec from Bec E aqui na verdade eu vou concatenar o que eu tiver mas o password eu quero mudar para fazer o meu hash né e aqui eu passo o password limpo com esse hash sync E aqui é o salt n é o salt é uma informação adicional de segurança de hash que se eu tiver por exemplo duas pessoas com o password 1 2 3 4 5 6 ela não vai
gerar o mesmo hash porque isso aqui é um perigo né inclusive eh na se vocês estudarem um pouquinho sobre eh essa questão de autoindicação inclusive eu tava fazendo um curso no Full Cycle 4 sobre isso tava falando com isso com os alunos fiz um curso completo de autenticação e autorização Lá nos anos eh 70 se criaram o algoritmo de hash para essas senhas mas aí ele sempre geravam vamos supor assim sempre o mesmo hashing Aí era fácil você fazer um brutal force e adivinhar a senha né então com o salt senhas com os mesmos valores
vão sempre gerar eh a chance na verdade é muito pequena de gerar hashs iguais né beleza então isso aqui é o mínimo que a gente precisa Já vamos terminar os outros métodos aqui ó Se eu quiser consultar quiser fazer outras coisas vamos fazer aqui um eh Prisma Service user p find para poder buscar vários aqui Eu poderia passar alguma busca Esse aqui é o meu copilot Eu vou deixar ele ajudar um pouquinho né o assunto não é mas eu posso passar aqui um find Eh porém aqui vai ser string né o ID que a gente
tá recebendo tanto aqui também ó Aí tem update eu passo o ID do usuário e os dados e tenho o remove aqui no update Eu não tô nem preocupado com a questão do password mas eu poderia né e ver se tem ver se tem password eh e aplicar o hash tá não tô preocupado com esse update aqui só a criação porque senão a gente não vai conseguir criar usuário no final das contas Então ó o controller eu vou ter que mudar aqui ó porque toda vez que ele recebe o parâmetro de rota sempre vai ser
string mas eu vou ter que tirar o mais porque o mais no JavaScript ele converte para número então vou ter que tirar Pronto ó Beleza Então vamos fazer aqui o npm run start dev Aí nosso projeto tá disponível A medida que a gente vai criando as rotas olha que bacana ele vai eh mostrando todas essas rotas disponíveis Então tenho o meu crude completo de usuário aqui Eu vou usar uma extensão pra gente poder brincar com as chamadas chamadas de R client essa extensãozinha aqui ó Então eh eu posso criar um arquivo api HTTP Aí eu
vou fazer aqui ó um post A gente dita a requisição como ela é Local host na porta 3000/users Então tem que passar um JSON é de prash Então coloca o Jon Tem que saltar uma linha Então aqui vai ser o nome Vamos colocar aí John Do Aí a vai me ajudando Na verdade aqui eu não quero criar um John do Vai tá muito genérico Vamos criar o admin O e-mail vai ser admin@user.com Aí eu tenho password que eu vou colocar como admin Tem a RLE que vai ser admin Tem mais alguma outra informação São quatro
informações né beleza Então vamos ver o que que vai acontecer Deu um erro 500 aqui Ele não pôde ler o hash sync do Ah já sei o que aconteceu Eh tem essa não vou falar um palavrão aqui né mas quem é da comunidade JavaScript sabe que à medida que o JavaScript foi evoluindo foram surgindo 300 tipos de módulos módulo AMD common modo eh S6 modul Então aqui na verdade é a compilação do Nest que ela não tá eh habilitada para poder trabalhar aqui com o módulo do BCPT que é uma biblioteca mais antiga A gente
vai usar aqui ó a opção do S module interoperability true que ela aí ela suporta qualquer módulo aqui Então vamos abrir de novo o que é http fazer a chamada e ah no caso admin ó tá vendo como que ele valida eu não posso passar admin dessa forma tem que ser o admin maiúsculo Então vamos passar aqui o admin maiúsculo Aí ó tá aqui o nosso usuário criado Esse aqui é o ID lá que é aquele seio o ID do esquema né que o Prisma acaba gerando que tanto faz né se alto em ó o
nosso aqui Então tá tudo certinho ó Data de criação atualização tudo bonitinho e tal Então beleza E vamos constar usuário aqui Então eh vou colocar get Aí é só colocar três hashtags Aí eu consigo pesquisar todos os usuários Se eu quiser colocar a pesquisa de um usuário só aí eu passo esse ID aqui Aí consuário enfim né eu não vou eh testar os outros end points porque eles não são relevantes né a gente já conseguiu criar aqui a nossa área Então pelo menos agora eu tenho o usuário Agora vem a parte de autenticação Ó José
Osaka acabou de chegar aí Boa noite Que que o pessoal tá falando aqui tá beleza Vamos continuar aqui Então a gente já tá aprendendo aqui com o Nest que eu organizo a a essa questão de usuário em usuários A autenticação poderia fazer parte desse módulo Bom eh não há nenhum crime Eu não vejo isso como errado eu só não concordo tá porque a gente pode criar um módulo separado de autenticação e deixar essa parte de usuários aqui somente para usuários porque daqui a pouco vão ter mais coisas Então autenticação pode ser um módulo diferente de
usuários Então vamos fazer assim ó A parte de autenticação então vai ter a parte do login Nós vamos fazer então a criação de primeiro eu não vou ter um crude né para autenticação Vamos criar um módulo chamado de ALF Aí agora eu tenho módulo de autenticação e eu vou ter que ter um controller também Então nest generate controller al Esses comandos do Nest eles são inteligentes porque veja só eu coloquei um controller alf né eh eu não tive que falar para ele qual onde que ele tem que ficar Como o Nestu tem uma pastinha Alf
então ele joga o controller também e ele acaba inclusive registrando o controller Não é legal isso é muito legal né então eu já tenho o controller Que que a gente vai habilitar aqui ó eu vou ter um login que eu vou receber um posso já colocar o @boring com o meu login dto E aqui vai ter o verbo postin Então nós vamos ter o barraalf/login né então já posso criar aqui o login.dto Export class login dto Aí vou ter que passar e-mail e password Beleza então só tem que importar aqui o nosso DTO Então agora
vem a nossa regra de negócio né a regra de negócio fica onde nós já entendemos como que funciona o framework Ela fica em service Eu vou criar um service também com o mesmo nome Então aqui no meu injectable com alf service já tá bonitinho aqui em providers nós vamos fazer o login que vai receber o login dto do tipo login dto E a nossa ideia aqui é pegar essas credenciais verificar se o usuário existe verificar a senha e gerar o nosso tão famoso token JWT N a nossa ideia é justamente essa Mas para lidar com
o JWT nós também já temos uma parte do próprio Nest Então vou fazer npminstall@nest Opa ns@jwt Ele tá mostrando um deixa eu terminar esse terminal aqui abrir de novo que ele tá mostrando um lixo ali em cima né que parece que ele tá rodando aí do Nest e não tá tá então esse módulo ó é de JWT Ele vai ser o primeiro módulo que a gente tá usando num submódium Então vou chegar aqui ó colocar um JWT modo importado do pacote que a gente acabou de instalar Headster que é a forma dele para que a
gente passa aqui algumas configurações Então eu posso passar aqui eh o secret para poder validar o JWT Não quero trabalhar com variável de ambiente Vamos colocar aqui apenas secret Isso aqui não importa O sign options eu quero que ele spire que o token pode não ter inspiração quer que ele inspire em 2 horas porque senão a gente vai ter que ficar gerando token toda hora E o algoritmo vai ser o HS256 Isso aqui é importante tá isso aqui é muito importante Por quê inclusive eh tá falando que eu ministrei um curso recente de autenticação no
curso Full Cycle Eh existem alguns ataques como o RS256 HS256 ou non ataque São dois ataques que quando a gente não especifica não significa que sua IP tá exposta se você não especificar mas muitas vezes esses ataques se aproveitam quando você não especifica o algoritmo de assinatura do seu token Então essa aqui é uma dica que vale para qualquer tipo de aplicação Então isso aqui vai permitir que eu use esse JWT aqui ó como um serviço Então ele vai me dar um JWT service E agora eu posso fazer aqui a minha lógica Primeira coisa que
eu vou fazer não é gerar o token né vamos pegar aqui o usuário Então eh na verdade eu precisar do Prisma também ó O Prisma tá global ele é acessível em qualquer lugar Então Prisma Service Eh tá faltando uma aqui tá certo então aqui ó é exatamente isso que eu quero Primeira coisa vou passar aqui payc Eu quero consultar lá no banco de dados se eu tenho usuário com determinado e-mail Se eu não tiver usuário então um erro not found Depois eu posso ajustar melhor esse erro aqui Mas agora eu quero olhar se o meu
PW é válido Então is password valid Aí eu vou usar aqui o bcarec passando as duas senhas Então aqui em cima eu tenho que importar o Becpt Então eu passo as duas senhas a senha que eu recebi e a senha do usuário que eu encontrei Então se Pesso não é válido na verdade isso aqui não seria legal né eh eu posso colocar aqui um invalid credentials por enquanto ou invalid credentials A gente não pode falar paraas pessoas que aconteceu de fato né porque senão vai ficar tentando a senha até adivinhar Isso também é um risco
Então agora pra gente poder gerar o nosso token eu posso usar esse JWT service dessa forma aqui assinando um novo token Então aqui eu posso passar o nome do usuário e-mail e outras coisas que vão ficar ali no payload que não seja nenhuma informação sensível E aqui eu vou chamar na verdade de access token não desse token que tá ali tá show de bola Então aqui no meu controller eu importo o meu serviço que a IA já entendeu o que que eu quero fazer E agora nós simplesmente fazemos um alf service login passando o DTO
Maravilha Então vamos rodar aqui a nossa aplicação E agora eu tenho a minha nova rota aqui ó Tá vendo então beleza Vamos aqui pro API HTTP Então agora vou ter aqui um post http 2/ barra local host na porta 3000/alf/login Aí vou passar mais uma vez um application JSON com usuários 100 Então e-mail vai ser o admin@user.com que eu já tenho né eu tinha criado antes E o password admin aqui com três hashtags E tá aí o meu token JWT criado Vamos inspecionar ele aqui no JWIO que é a principal ferramenta que a gente tem
hoje aí na web Inclusive tá com a interfaceinha nova aí ó Tá lá ó com admin e admin@user.com Ele até coloca aqui um is né que é um outro clim a gente chama de clim Essa essa parte aqui da eu tenho climes que são privados que são padrões privados É quando eu quero colocar alguma coisa aqui específica para um sistema Os default são esses ad expiration time e esses públicos são essas informações que estão aqui Então conseguimos gerar Se eu colocar até a aqui a como secret aí o token é válido então já consegui fazer
a minha autenticação né beleza então agora qual que é o próximo passo aqui nós já temos uma parte que já dá para bloquear o acesso né que somente usuários autenticados ou seja com a a identidade estabelecida podem acessar Então sempre vou ter que passar o token para poder fazer essa verificação Como que a gente consegue organizar isso no Nest através de um guardião Guarde esse nome Guardião Então vou fazer aqui ó generate e guarde alf também Guardião vai ser espécie de um serviço mas ele implementa esse can activate em que eu recebo o contexto da
execução tá e é muito importante que a gente entenda o que é um contexto da execução porque pode ser um HTTP que tá vindo aqui mas às vezes pode ser uma chamada que você tá recebendo uma mensagem de um CFC ou de um Rapt MQ Pode ser ao que não seja HTTP Então o contexto da execução é qualquer coisa que tá chegando pode ser até um command line tá a ideia desse guardião é o extrair esse contexto e validar o acesso para poder permitir que o usuário acesse aquele recurso ali Então eh o que que
a gente vai ter que fazer aqui para permitir que o usuário tenha acesso que eu vou ter que pegar o token o JWT que vai ser passado vamos supor aqui ó na hora de consultar um usuário a gente vai ter que passar um header autorization bearer Bear é apenas um um marcador dizendo que a gente vai passar um token né então aqui eu passo o meu token JWT Aí então primeira coisa vou ter que extrair uma request do contexto ó Então do contexto eu faço um switch para HTTP get request Ele me dá request Aqui
é bom que eu importe o tipo da request que vem lá do Express né para isso aqui é uma título de curiosidade por padrão o Nest ele a ele é um framework construído em cima do Express que é um dos frameworks mais antigos da comunidade Node Então aqui é importante ó colocar um request aqui Então eu quero pegar o meu token que vai estar nessa request Eu extraio lá o header authorization E ainda eu tenho que tomar cuidado para não pegar o barrier aqui né então eu faço aqui um ponto split espaço pegando a posição
um e ainda tem essa interrogação que a acabou adicionando aqui Isso aqui é a forma do JavaScript O que que acontece aqui ó eu tenho bearer mais o token Eu tenho que pensar que às vezes o header autorization não foi passado Então essa posição autorization ela pode não estar no objeto JavaScript Então o interrogação é chamado de optional chaing Então ela me permite uma segurança né que se eh eu não tiver essa posição ele não tenta fazer o split porque vai dar um undef e você tá acessando o split de undefined Então a gente acrescenta
isso e o split gera um array separando através desse caracter Então vou ter um array com duas posições o barer na primeira o token na segunda pego a primeira posição Então se eu não tiver o token mesmo assim nós podemos retornar aqui um erro específico do Nest que é um troll new authorizate unauthorized exception token provided ou token not found ou algo assim tá de bom tamanho Agora se eu tenho token o que que nós vamos fazer eu vou ter que validar esse token Eu já tenho o serviço do JWT Então JWT Service de JWT
Service B JWT service verify passando o token E ainda se eu quiser passar aqui o algoritmo para poder frisar ó só tô trabalhando com HS256 se ele consegue fazer a verificação Então eu tenho o payload do token que é aquela parte que a gente viu aqui Eu já tenho o objeto bonitinho para poder manipular alguma coisa que eu queira né tá se eu já tenho isso aqui seria legal eu pegar a o usuário e já deixar esse usuário disponível para que eu possa acessar depois né mas vamos fazer isso depois Eu não vou fazer isso
agora Vamos pegar aqui pegar ou usuário e colocar na request Colocar na request Eu não vou fazer isso agora Ele tá tentando me ajudar mas não é isso aqui que eu quero não tá eh se eu tiver esse sucesso aqui eu já posso retornar um true Faltou o cat Se eu tiver aqui o catch seria bom pelo menos eu fazer um console error passando o error aqui E aqui eu posso deixar esse anaorize exception e ainda passar aqui um terceiro parâmetro que é a causa do erro porque o erro em si não é esse unauthorized
exception que eu tô passando o erro foi esse que veio daqui Então eu consigo fazer um rastreamento melhor da das exceções lançadas fazendo a ligação entre elas né inclusive para quem trabalha com JavaScript saiba que nas eu não lembro exatamente qual é a versão eh o error tipo error do JavaScript agora tem o essa causa tá então lembre-se sempre de passar a causa porque na hora de você fazer o log eh fazer o registro disso você tem toda a stack de tudo que aconteceu tá eh esse na verdade verify aqui ele tem um ait Então
aqui eu passo s e aqui eu tenho que retirar isso tudo aqui Show de bola É ele tá cheando aqui para mim falando que ah porque eu não tenho nenhuma tipagem aqui Vamos falar que isso aqui vai ser um na verdade dá para passar tipagem como generic aqui Vamos falar que eu vou receber aqui um name que é uma string um e-mail que é uma string Por enquanto vai ser isso aí Ele tá na verdade eu não tenho a weight aqui é isso que ele tá falando Beleza agora minha variável só não está utilizada Show
de bola A gente vai voltar aqui ainda mas agora como que a gente faz para poder garantir que somente usuários autenticados acessem as funcionalidades da API de usuários Então eu posso chegar aqui em cima e coloco use guards passando alf guard Então esse use guards é um decorator do Nest ó Tá vendo ó da parte aqui do comm do Nest que eu vou usando guardiões Então posso ter várias verificações ao longo da minha chamada Ah se eu quiser fazer passar 10 guardiões aqui eu posso Não que vai ser muito produtivo né porque depois poder manter
tem como até agrupar esses guardiões se for necessário mas agora eh o meu controller está totalmente protegido Vamos lá Então eu vou rodar aqui a minha aplicação e aí ele vai dar um erro e a gente cai aqui né ah mais uma vez naquela questão dos módulos Ele tá falando o seguinte ó Eu fui tentar usar ali o Alf Guard né não conseguiu encontrar uma dependência dele que é o JWT Service Aí ele começa a dar algumas dicas O que que tá acontecendo aqui na verdade eh quando a gente registra esse módulo aqui que nós
instalamos né do Nest para poder lidar com JWT inclusive esse módulo na verdade ele é apenas um Oper lá pro Jason Token que é a liba aí da comunidade Note para poder administrar o JWT Eh esse módulo aqui ele não o serviço que tem dentro dele o JWT Service ele não tá como global também ele só tá disponível no módulo que tá usando ele Então quando eu pego o guardião que tá no outro módulo e jogo ele aqui o Nestar aquele JWT Service Então tem que chegar aqui nesse caso e colocar um global igual a
true Esse global igual a true é a mesma coisa de fazer esse decorator aqui mas nesse caso a gente tá criando um módulo nós mesmos Nesse caso do JWT modum ele vai fazer lá o módulo ser global né então agora a gente vê que voltou a aplicação Show de bola Então se eu tentar fazer aqui a minha chamadinha que vai acontecer ó invalid token Eu não consigo mais fazer o acesso A gente pode ver aqui ó que na verdade a gente até passou um token totalmente inválido Ele vai acabar pela lógica aqui ele vai acabar
caindo aonde ele vai acabar caindo aqui né porque ele vai conseguir extrair o token que vai ser apenas a palavra JWT Então na hora que ele vai fazer a verificação não rola né então vamos lá Vamos fazer um teste aqui agora Eh eu tenho que fazer aqui o login Então do login vou passar o token para cá Aí eu consegui acessar Então já tenho a minha autenticação funcionando Então agora eu posso proteger qualquer controller da minha aplicação através desse guards passando o meu guardião Agora muitas vezes você não quer proteger o seu controller inteiro Aqui
todas as rotas ou seja todas essas esses métodos aqui estão protegidos pela autenticação Às vezes você tem um método público né então você pode colocar o guardião também por métodos se você quiser Tem outras formas também de fazer organização mas se eu quiser ficar fazendo isso aqui eu posso mas nesse caso eu não tenho nenhum método público né então eu coloco ele lá em cima que vai me ajudar melhor Beleza agora vamos voltar aqui pro guardião porque eu quero colocar usuário autenticado aqui né eh seria até bom na verdade a gente voltar lá no Alf
Service e além do do nome do e-mail eu poderia colocar também qual é a role do usuário É importante já ter isso no payload porque quando a minha aplicação recebe eu já posso usar reusar essa informação E poderia colocar aqui também eh o subject né que seria o user ID O sub já é uma clim default do JWT que é o dono o sujeito do token subject Então agora vamos ver aqui como que isso vai ficar ao fazer o login O token aumentou um pouquinho de tamanho Aí eu tenho subject e tem a roll dele
Aí isso aqui vai nos ajudando vai nos ajudar depois a fazer a nossa autorização tá então eh vamos fazer aqui no guardião Se aqui agora eu recebo não só name e e-mail eu recebo também a RLE que é do tipo rolles lá do Prisma Eh e eu recebo aqui também o subject que é uma string Então vamos pegar aqui o usuário do Prisma Então aqui eu vou pegar private prisma service tipo Prisma Service Certo então aqui eu faço um dis Prisma user find e unic passando o ID que é vem do próprio sub né então
show de bola Posso também fazer uma validação aqui né que se eu não tiver o usuário não posso nem continuar É algo estranho né alguém passou o token usuário não existe por algum motivo É importante fazer essa validação Então aqui eu coloco um request user igual a user A questão é que eh a request do Express que nós estamos usando aqui ela não tem esse user por padrão Então o Typeescript vai apontar esse erro ele vai falar que o usuário não está presente Aí o que que nós podemos fazer aqui vou criar uma tipagem alba
types aqui em cima com a pasta express mais uma tipagem Então faço assim ó index.d.ts que é um arquivo apenas de definição Typeescript ele não tem e eh lógica nenhuma né então aqui eu vou declarar declare global com namespace express interface request É isso aqui Porém ó eu tiro todas essas informações Eu vou acrescentar esse usuário que ele não vai ele pode não existir né porque às vezes eu posso estar numa requisição que eu não estou autenticado mas aqui eu vou importar o user lá do Prisma Client E aqui é bom colocar importar que eu
tô importando o tipo E aí aqui eu tenho que fazer o import type @ ou melhor e interrogação express de express para que a IDE consiga interpretar esse novo tipo meu aqui Aí ele tá falando que o tipo não é usado Eu posso adicionar um S link de para linha Pronto que ele tá fal ele vai ficar dando chiando aqui que eu não tô usando esse Express ele é importado apenas para que a ideia entenda é que mudou essa tipagem da request Agora não tá dando erro mais Então se eu quiser acessar por exemplo aqui
a request eu coloco assim ó @ request hack é do tipo request do express Aí eu tenho o hack user como tipo ó Tá vendo mas aqui a gente não vai precisar disso mas o de pr seria ter o usuário que estar que está autenticado ali carregado né tá show de bola pessoal à vamos fazer aqui a parte agora do post né eh a gente tá criando uma IPI muito simples não quero fazer nada elaborado Vou apenas criar mais um modelo aqui que vai ser interessante pra gente iniciar a parte de autorização Então ó eu
tenho aqui já a parte de um post com ID o título do post o conteúdo que no banco de dados vai ser um tipo text então ele é bem maior se tá publicado ou não Qual é o autor do post que é de prash né então tem ali o relacionamento com o módelários aqui Ele tá descrevendo a relação dessa fórmula esse relation Tô pegando o autor ID que é essa de cima aqui referenciando o ID da para ele poder fazer a chave estrangeira Então quando eu pressionar aqui o alinhamento olha que legal que ele vai
fazer aqui do usuário eu posso pegar todos os posts dele O Prisma faz isso pra gente Então ó que eu vou fazer aqui agora Hã npx Prisma migrate def para ele poder criar essa tabela paraa gente Dar enter Então agora eu tenho aqui a minha segunda migração com a tabela e tá aqui a a chave restrição da chave estrangeira do comport Então já tá executado já tá funcionando Eu já tenho o tipo do post Nós já aprendemos a fazer um novo crude não já então vamos lá Generate source Vamos criar aqui ó posts R API
Aí coloca yes Que ele vai fazer ele vai gerar aqui o post pra gente Então tem o módulo tem o controller tem o serviço tenho todos os métodos aqui Então vamos pegar aqui no create pra gente poder eh determinar aqui no DTO quais informações são necessárias Preciso do título conteúdo e se tá publicado ou não Vai ser um bully São essas informações necessárias Então eu já tenho o Prisma A gente já sabe que é só pegar o Prisma Service aqui e ser feliz né não tem muito o que fazer Ó na hora que eu faço
post aqui eu consigo fazer o create deira passando o meu create DTO Eu acho que ele ainda Ah tem que importar por isso que ele não pegou a tipagem que ele tá chiando aqui Tô retornando Deixa eu fazer um restart do S Lint Às vezes é chatice dele Agora sim à o Ah tá faltando o autor né aqui ó já é uma questão interessante de como resolver porque olha só eh no controller eu recebo o DTO que são as informações enviadas mas o autor não vai ser enviado na request a gente vai pegar ele a
partir do token JWT que foi extraído Na verdade aqui no service eu não recebo somente o DTO Eu vou concatenar com o autor ID que vai ser uma string Aí agora o erro sumiu daqui ó Tá então tem o find a aqui também vai ser string unic pelo ID a mesma coisa que a gente fez lá com usuário que eu não tô interessado em detalhes desses métodos Vamos avançar Aqui também é string E aqui também é string Agora aqui a gente tá passando ó aqui já tá dando erro porque ele tá falando que tem que
ter o autor ID aqui Vamos tirar o mais Vamos tirar o mais e tirar o mais Agora como que eu consigo pegar o usuário autenticado a gente já aprendeu anteriormente Então coloco aqui @hack vai ser do tipo request Tem hora que o VS Code não importa Eu fico triste na hora que ele não importa aqui Bom que na aula ele tá funcionando né mas em off ele não funciona Acho que ele ia ficar ele ia ficar com vergonha se ele não aparecesse Então as informações que eu vou passar aqui vão ser todas que vem da
request mais o ID do usuário que eu tenho na request Aqui ele tá falando que o usuário possivelmente seja unde defined mas como a gente vai colocar um us aqui em cima com o alf guard eu garanto a autenticação Então aqui eu coloco o assertion new né é muito importante conhecer essas eh estruturas do JavaScript Eu tenho assertion new tenho o optional chaining O assertion new eu tô quando eu coloco a interrogação tô dizendo eu garanto que tem variável aqui tá não precisa me pentelhar falar que é possivelmente undefined É isso Eh muitas vezes é
assim que funciona né você tem a variável que possivelmente undefined mas você tem certeza que você tem o valor dela Então show de bola Já fizemos aqui a nossa outra parte Então eu já tenho módulo aqui há alguns segundos né muito rápido isso aqui Então vamos fazer o start dev Agora eu já tenho as partes aqui de post né então vamos lá Eh depois de autenticar aqui vamos fazer três hashtags fazer o post para http local 3000/psters E aí eu faço um content type application Jon Então a gente vai passar aqui o título o content
e se tá publicado ou não Não eu não vou passar o ID aqui do Vou colocar como true Para que eu não tenho que ficar copiando o token toda hora eu posso usar uma estratégia aqui ó Eu coloco uma hashtagzinha aqui e coloco assim ó Name eh admin login Aí aqui embaixo eu posso criar uma variável que vai ser eh token admin Aí aqui vai ser admin login response pbarbor Accessen Pronto Beleza Aí que eu posso fazer aqui agora coloco autorization bearer passando meu token admin que aí eu não preciso mais ficar sofrendo Então agora
quando eu fizer o meu login eu já posso clicar direto no post e aí tá o meu post criado Algum motivo de usar class para DTO ao invés de interfaces eh sim um motivo muito importante porque eh a interface no JavaScript ou melhor no Typescript que no JavaScript não tem se eu crio uma interface assim a interface no momento que ele compila para JavaScript ela é descartada ele é um tipo que não representa nada no JavaScript Então se eu quisesse adicionar validação de dados o que a gente acaba adicionando no DTO não tem como porque
interface só delimita um contrato né então tem um motivo muito grande porque a classe ela sim vai representar um tipo que vai permanecer Type também é a mesma coisa tá tanto interface quanto type eles são descartados na compilação de TypeScript para JavaScript Então não seriam úteis aqui Eles são seriam apenas para poder modelar Aqui a gente tá tendo um objeto para valer entendeu eu posso adicionar aqui comportamentos de validação coisas complexas eh eh filtro de dados e algo assim tá então a gente eh só consegue acessar aqui a parte dos posts se a gente tiver
autenticado também né ó tá vendo eu não consigo pegar aqui os posts somente se eu passar o meu token Então posso copiar essa parte para cá Pronto Tá então beleza nós chegamos aqui no numa etapa da nossa aula Chegamos numa etapa da nossa aula Nós terminamos a parte da autenticação Nós estamos utilizando né para poder concretizar uma autenticação stateless porque o servidor não guarda nenhum estado da sessão do usuário O cliente sempre tem que passar todas as informações e o servidor sabe processar É assim que a gente faz uma IPI REST né ir tem esse
conceito de ser stateless porque também o HTTP é stateless Ó autenticação com JWT é a autenticação hoje mais utilizada em API Mas agora vem a parte da autorização né que eh acho que tá meio implícito acho que para todo mundo aqui sabe o que que é autenticar alguém independente do tempo de experiência que você tenha mas eh tem que ficar muito claro que autorizar né a mesma coisa que eu estou entrando lá num show apresentar o ingresso significa autenticar Ah você o fulaninho que tá apresentando o ingresso aqui agora Esse ingresso seu te dá autorização
para ir para qual bloco ah você vai lá pra área VIP vai para bloco leste bloco oeste enfim Então a autorização ela é a pós autenticação Não posso autorizar alguém que não está identificado E a autorização é simplesmente dar acesso o que você pode fazer certo isso eu quero falar só para que nós estejamos na mesma prancha E nós já temos uma forma de autorizar esses usuários que é através da própria role deles Roll que é o papel que o usuário representa dentro do sistema Eh esse papel pode estar de encontro com o cargo que
você tem dentro da organização Ah então ser um gerente posso ter aqui uma role de gerente você é administrador você é o CEO da empresa ou qualquer coisa assim você é um funcionário poderia ter um employee aqui ou algo assim né enfim E aí essa esse papel ele já carrega uma carga de permissões e se torna fácil mais fácil então eh dar esses acessos Quando a gente trabalha está trabalhando com isso É o que é mais importante na verdade pessoal que eu já vi em muitos projetos na verdade até de empresas startups e etc Eh
eh o o que muitas vezes acontece auto indicação você acaba encontrando muito material cursos e etc Eu falo isso bastante lá dentro do curso full cycle mas a autorização muitas vezes a gente fica inventando coisa da nossa cabeça e cria um modelo de autorização uma forma de autorizar que é totalmente despordadorizada que ela não suporta o o crescimento do projeto refaturação e depois o seu projeto acaba quebrando Eu já vi muita aplicação desse tipo tá então eh trabalhar de fato com a autorização de uma maneira bacana que permite você refatorar demanda que você tenha um
entendimento muito legal desses modelos de autorização Como nós temos design patterns né que são single factory strategy observer enfim finitos design patterns nós temos também os chamados modelos de autorização que são como design patterns para a gente organizar as nossas autorizações Então quando eu estou falando desse modelo de roles e permissions papéis de usuário e permissões nós estamos falando do RBAC que é um acrônio para RLE based access control que é o controle de acesso baseado em rols Então nisso eu vou ter três agentes Tenho o sujeito que é o próprio usuário mas pode ser
um sistema Tem a roll que a gente já viu ali que é justamente o papel do usuário e as permissões Permissão é ação que você tá executando no sistema É criar o post excluir o post aprovar o empréstimo eh dar entrada numa venda enfim tudo isso é é uma é sempre algo normalmente ligado a um verbo né então quando eu tenho uma RLE aqui ligada com esse usuário eu já posso fazer uma implementação desse ABback né a gente pode chamar deback ou RBAC tanto faz a forma de ser eh chamado tá então a gente vai
fazer aqui o seguinte Primeira coisa como essa parte aqui de autorização faz parte aqui desse módulo de alfa tô considerando esse módulo de alf mais genérico né e eu vou criar aqui um requed roldecorator Vai ser um decorator pra gente poder registrar as roles necessárias para poder acessar alguma coisa Então vou importar aqui um camaradinha chamado de set Mera data que é do próprio Nest Então eu vou exportar um requed roles e eu vou passar aqui uma lista de rol permitidas e aí eu chamo esse seta data passando uma string e passando roles tá eh
o que você tem que entender em relação a Decorator no JavaScript é que o Decorator é um padrão da própria linguagem Não precisaria fazer isso aqui dessa forma com o Nest mas fazendo eh dessa forma faz com que a gente facilite as coisas É eh um decorator ele tem basicamente dois objetivos Ele é um design pattern também Ele é um design pattern que serve para muitas coisas A gente tá vendo decorator sendo usado aqui o tempo inteiro mas ele tem dois objetivos Ele serve para poder documentar algo ou para poder eh influenciar influenciar o comportamento
de algo O que que é documentar algo isso que a gente já tá fazendo aqui a a live inteira @controller @post Isso aqui não tá tendo mudança O o decorator ele pode mudar a classe ele pode mudar o método mas ele tá servindo apenas como documentação porque quando o Nest vai carregar o módulo ele vai varrer esses decorators inteiro e vai montando lá o projeto Na verdade isso aqui é apenas um facilitador né por debaixo dos panos a classe ela não tá funcionando dessa forma Então a documentação com Decorator serve para isso Eu documento para
depois poder pegar no momento posterior e fazer alguma coisa Agora um decorator ele pode também eh influenciar algo Às vezes eu posso ter um decorator de validação aqui Isso é muito comum Então na verdade quando esse método foi executado aí esse decorator vai capturar a chamada pegando os parâmetros e tal valida e depois ele repassa né então ele funciona como uma espécie de proxy de intermediário tá então essa explicação aqui ela é muito importante que vocês entendam Então esse decorator na verdade ele vai servir para documentação Então como eu tenho required rows eu posso chegar
aqui no post e começar a usar esse decorator através do controller Eu posso colocar o required rolls aqui em cima Posso mas aqui eu vou ter uma permissão eu quero uma permissão mais específica para cada método Criar posts Vamos colocar que somente eh escritores e editores podem criar posts Quem pode pegar posts escritores editores leitores Aqui já tem um problema né como eu posso colocar aqui não sei se você já vê um problema que um se um usuário ele é leitor ele pode ler porque tá ele pode ler mas só pode ler posts poderia somente
ler posts que estão publicados Ele não poderia ler posts não publicados Aí vamos deixar aqui Aí teria que fazer uma consulta aqui Ah se ele é um reader aí eu só posso consultar posts que estejam publicados Enfim para poder pegar um post a mesma história Vou repetir isso aqui Agora para poder fazer a a edição somente um escritor e um editor poderia fazer a edição Já a exclusão eu posso colocar um admin né o admin não está colocado aqui em cima porque entende-se que o administrador nesse caso teria todas as permissões mas para excluir somente
o admin Então dessa forma aqui ó eu coloco esses decorator se torna mais fácil Mas como que eu vou agora garantir que somente os usuários autorizados acessem as funcionalidades também através de um guardião então vamos criar aqui um nest generate guard Eu vou chamar de roll também Na verdade eu criei errado né eh deixa eu excluir ele aqui Bom que ele não foi registrado em lugar nenhum Eu quero que ele fique dentro do alf Ele foi criado na raiz Então aqui eu já tenho que colocar alf/ row por causa do nome dele Então ele vai
criar aqui o guardião Inclusive ele cria que até o teste né para se eu quiser trabalhar lembra do que eu falei do contexto da execução que é o que tá sendo executado no caso eh é um http com um controller Aqui dentro desse objeto context eu consigo extrair quem que vai ser executado né então eh eu vou chegar aqui com um novo serviço chamado de reflector que é um serviço do Nest que vai permitir que eu pegue uma estrutura e extraia eh decorators dela informações que estão nos decorators Então logo aqui de cara eu vou
pegar o meu required rows que vai ser this reflector get A minha intenção é pegar uma coleção de rollers já coloco ela aqui Aí aqui eu passo rows e o get handler Olha só que legal isso aqui esse reflector Então como eu falei ele vai extrair essas roles Eu já coloquei aqui a tipagem poderia omitir isso não era nem necessário mas é legal Aqui eu passo qual que é o a o identificador do decorator Por que que chama roles porque eu coloquei ele como rolers aqui Então esse set mera data né que serve para documentar
o o decorator ele cria essa identificação Então eu extraí roles do handler que vai ser o método do controller que está sendo executado Se caso eu perceber que eu não tenho nenhuma role requerida tem porque eu proibir nada Eu já retorno true aqui né dá até para simplificar isso aqui Retorno true Agora se eu tenho roles requeridas eu vou ter que comparar as roles requeridas com as roll a roll do usuário Então vou ter que pegar a request pego o meu usuário aqui dela Lembra que o Alf Guard ele já joga usuário aqui na request
ó Então estou reusando isso mais uma vez Aí aqui em cima eu tenho que importar essa request aqui né tá vendo que às vezes ele não importa ficou com raiva do VS Code porque ele não importa a request aqui ó Beleza então peguei o usuário Agora pode ser isso aqui que ele tá mandando Na verdade não não pode ser isso aqui Eu vou retornar vou pegar ã vou chamar isso aqui na verdade de alf user Se off user p roll aqui eu garanto que ele tá autenticado for igual igual igual a roles ponadmin ou se
required roles includes a roll que o usuário tem Que que eu quero dizer aqui vai retornar true se ele é um admin ou se dentro das roles requeridas alguma delas é a roll que o usuário tem Então ele está autorizado Essa aqui é a minha lógica Certo beleza Então esse guardião aqui ele vai agora em conjunto com o outro guardião de autenticação mas ele tem que ir depois Cuidado porque a ordem dos guardiões eles são na verdade aqui eu coloquei como roll só ou tá como roller né no singular A ordem dos guardiões ela importa
porque primeiro lembra conceito eu tenho que autenticar aqui autentica e aqui autoriza pela roll né beleza então aqui já está eu não preciso colocar em cada um já coloquei aqui em cima Vamos agora fazer a criação de mais usuários né pra gente poder fazer a a brincadeira aqui ó Eh eu posso copiar essa parte falar aqui eh create admin para deixar comentado Agora aqui create reader por exemplo Aí aqui vai ser reader Reader e aqui reader Pronto Aí aqui na verdade faltou mais uma hashtag Vou rodar a aplicação de novo Show de bola Então vamos
criar aqui o nosso reader Ah na verdade falta eu tenho que logar com a admin né tem como fazer sem então aqui agora eu vou ter que pegar aquele autorization aqui de baixo e passar para cá ó Aí ó criei o meu reader E aí eu posso fazer a minha autenticação com ele Então vamos duplicar essa partezinha aqui também Eh aqui eu vou chamar de reader login e aqui de token reader Aí aqui vem reader Aí eu guardo a variável que que fica fácil de usar ó Então beleza Eu posso criar post posso mas se
eu passar aqui reader melhor tokener eu tenho que logar primeiro né até ver se o token aqui tá certinho Aí o reader tal tudo bonitinho ali hein agora vamos passar ele aqui ó Aí ó Forbiden que é o o correto a se retornar ó 403 Se eu quiser retornar alguma mensagem mais específica aí eu posso né eh ah eu tenho que lidar com esse guardião aqui de uma forma diferente porque se eu ficar retornando falso diretamente aí a mensagem vai ser genérica Eu tenho forma de lançar uma exceção personalizada também que seria uma forma de
quebrar isso aqui ou fazer um tratamento de erro com uma estrutura do Nest chamada de exception filters né que eu capturo exceções e aí eu delimito o que eu quero mas é na verdade é talvez seja bom colocar uma exceção aqui Enfim conseguimos fazer essa parte né inclusive agora que eu tenho esse guardião aqui e isso aqui eu posso colocar algo do tipo na hora de criar usuários eh aqui ó na hora de criar usuários na verdade dá para colocar ficar aqui em cima Ou melhor roles pontadmin Pronto Eh aí aqui eu passo roll guard
Agora vamos fazer um outro teste de tem criação aqui do É se eu fizer a chamada ele der um erro por causa do unique não tem problema É que ele deixou passar só não conseguiu criar no banco porque tem a chave de unicidade Ele tá falando aqui do unic constraint Então enfim a questão pessoal é o seguinte né eh eu quero que vocês pensem agora né que eu tô vendo que vocês estão concentrados assistindo aqui a aula Se eu tiver ou melhor vou mudar a pergunta Qual o problema desse modelo que eu acrescentei aqui para
esse contexto aí dos posts na verdade até falei um pouco atrás né que foi um spoiler mas o que que vocês acham esse a backack a gente acabou de implementar aqui um a back né esse a back ele resolveria esses problemas vou beber água enquanto vocês pensem Que que vocês acham pergunta se a regra e se na regra apenas um determinado dispositivo registrado no banco de dados tivesse autorização além do login do usuário Eu não entendi a sua pergunta José Francisco Regra se na regra apenas um determinado dispositivo no banco de dados tivesse autorização Não
entendi É então eh vocês já eh eu só queria ver se vocês tinham eh pegado aqui a ideia Vamos pegar aqui o caso do usuário mesmo Por enquanto somente administrar tudo de usuário Princípio estaria OK mas vamos supor que daqui a pouco eu tenho uma rot roll né sei lá tenho agora gerente também Então o que que vai acontecer eh vou ter que adicionar aqui o gerente também e talvez até mudar em vários lugares A gente acaba tendo uma tabela de eh role versus permissions né então o problema doback é que quando eu começo ter
necessidades mais específicas como aquela aqui do post por exemplo né h um leitor ele só poderia ler posts que estão publicados não publicados não pode Então o que que vai acontecer eh como que eu vou gerenciar isso né aqui no find all eu vou receber um filter de published que aí teria que não ser obrigatório Esse filtro também teria que não ser obrigatório Eu poderia fazer essa filtragem aqui e aí dependendo do usuário eu vou ter pegar aqui o hack user se é igual a reader Aí eu passo aí daqui a pouco Não só o
reader também mas eu vou ter uma outra role também que não pode ver os posts publicados Você tá entendendo aonde que a gente vai acabar chegar de de chegar porque assim eh normalmente o que acontece nos sistemas é a gente até implementa umback e começa a inventar roda vai espalhando coisa Então você tem eh regrinhas aqui no meio do seu controller agora porque você tem uma necessidade específica Não é só você analisar a permissão e a roller você coloca alguma coisa aqui Aí daqui a pouco dentro da camada de serviço você coloca alguma coisa de
autorização aqui Aí quando a chefia te passa uma mudança você fica louco porque a autorização ela já se espalhou hard coded várias formas e você não organizou que agora para poder mudar você não tem controle mais né e ainda mais se você não tem teste aí corre um risco aqui bem grande de você estar autorizando eh usuários que não deviam acessar os recursos de acessar os recursos Esse é o problema Entender entenderam a ideia esse é o problema Então assim lição não tente reinventar a roda Use boas práticas Use boas práticas tá beleza eh o
José Francisco quero eh que apenas um dispositivo registrado tem a capacidade de fazer eh login no sistema Ah tá Nesse caso aí é uma outra história de autenticação Você pode até procurar aqui eh não é que você tem que trabalhar com essa ferramenta né mas tem aí o Klo para você poder ter um servidor de identidade Você faz essas autorizações Mas e para você poder fazer esse processo na verdade você tem que trabalhar com o outk não é um framework de linguagem é um método para você poder fazer autorização entre sistemas que é basicamente assim
vamos supor a Full Cycle tem o sistema educacional dela e aí ela quer usar o login da Google pros alunos poderem fazer o login de forma mais eficiente né para não ter que guardar ali o usuário sem Então eh dessa forma quando o aluno for fazer o login na Full Cycle no Google tem que tá autorizado lá Então você tem que ter um client e fazer um os fluxos do out aí entraria disso mas eu não vou abordar esse assunto eh aqui nessa live tá beleza pra gente poder brincar agora com essa parte mais específica
eh nós vamos organizar isso aqui de uma forma diferente Na verdade eh aqui dessa forma o back já não tá legal porque a gente sempre tá olhando pras permissões através da roles E na verdade o que seria interessante aqui seria que a gente colocasse assim permissions eh permission pon por exemplo assim quando eu coloco um decorator olhando para permissão ao invés da poderia até colocar algo tipo create post sei lá Quando eu olho assim aí fica melhor porque a mudança da a relação das roles com as permissões elas mudam Eu vou ter um mapeamento disso
em algum lugar né e isso aqui não vai mudar Eu quero ver quem tem a acesso ah da permissão Então ela um workback orientado à permissão na hora de fazer a verificação mas a gente já vai implementar algo melhor desse tipo Então cuidado quando você vê um modelo desse Inclusive você acaba vendo isso aqui na própria documentação do Nest né e não significa que isso vai atender ao seu sistema né então tem que tomar muito cuidado tá então vamos fazer aqui o seguinte Nós vamos instalar uma libada de Castle Inclusive eu vou indicar ela aqui
Uma das principais libes para você poder organizar a autorização Ela trabalha com vários modelos de autorização Ela trabalha com a backack ela trabalha com ACL e trabalha comback Nós vamos discutindo aqui ainda durante a aula tá então vamos instalar ela aqui A gente instala o Castle Ability Eu vou gerar um módulo para ela e um serviço também Colocar castle Eh na verdade a pronúncia né a gente pronuncia como eh castle pode falar castle ou castle também tá e é certo para o a palavra castelo é assim que pronuncia-se tá e eu vou criar em castle
e vou chamar de castle Ability Aí nós vamos organizar as nossas permissões aqui tá beleza aí nós temos que definir aqui duas coisas Export type permission actions e permission resource Tá nós vamos separar duas coisas Eu quero as ações que vão ser os verbos do que eu posso fazer Então vai ser justamente pode ser as operações básicas de um clude mas eu vou precisar incluir aqui mais uma específica que o Castle precisa que é o manage Posso incluir se eu quiser aqui aprovar aprovar vender não tem problema nenhum tá mas eh o manage é algo
padrão do Castle que quando o usuário ele tem essa permissão manage ele consegue fazer qualquer coisa ele consegue fazer qualquer coisa diante de um recurso específico por exemplo Então se eu tiver a permissão manage em post eu consigo criar ler fazer o update e fazer o delete O resource é justamente os recursos que eu quero disponibilizar Então é o recurso de usuário é o recurso de post é o recurso de produto é o recurso de cliente ou qualquer coisa que eu queira Então isso aqui vai ser um tipo chamado de subjects Eu vou passar aqui
um generic vou importar ele aqui em cima Import subjects from castle ability Então aqui eu vou passar eh user vai ser o user do prisma É post vai ser o post do Prisma Então isso aqui acaba sendo uma listinha que depois a gente vai acabar combinando Então eu tenho um tipo chamado de app ability que vai ser igual ao peer ability que é um tipo do castle em que nós vamos passar aqui um array com duas posições com as permissões e com o resource E aqui ainda eu não posso esquecer de colocar esse all aqui
se eu quiser dar todas as permissões para um usuário Eh ele tá cheando aqui comigo por ainda subjects Eu vou disponibilizar sim o repositório tá vou sim Eh tô achando estranho ele dando esse erro que eu fiz jáada eu importei Ah na verdade esse cara é porque eu tenho que importar ele não é da ten que importar ele aqui do do prisma Pronto Não é aqui Port subject castle barra prisma Eh pode pode parecer um pouco estranho isso aqui vai ficar claro quando a gente fizer todo o exemplo tá então recapitulando a gente tem as
actions tem o resource e tem as permissões da aplicação Eh aqui a gente tá usando uma lib mas o que que poderia eh melhorar aquela aquele código que a gente tem lá também sem biblioteca né a gente poderia ter um mapeamento de permissões roll permissions em que eu tenho aqui row admin Aí nós vamos ter eh para post ele vai por exemplo fazer um manager tá usando a mesma nomenclatura Aí no caso para um reader da vida ele só vai poder ler né eh a gente poderia ter um algo desse tipo mas eh mesmo assim
carece daquela situação de ah eu tenho a permissão de ler mas aí eu tenho que ler somente os posts que estão publicados Aí eu vou ter que fazer mais código aqui Eh poderia colocar uma outra restrição também de escritor só pode editar post que tá relacionado com ele né então um mapeamento desse também não ajudaria A gente vai ver aqui como que o Castle vai nos ajudar com isso aqui tá então fizemos esse mapeamento aqui Agora nós vamos fazer um mapeamento de eh eh roll permissions da forma dele Então vou definir aqui o export type
define permissions que vai ser uma função em que eu vou receber usuário Pode ser poderia ser que qualquer usuário mas vai ser o usuário do Prisma que já tá ali em cima e um camaradinho chamado de builder que vai ser do tipo ability builder passando o appility Esse ability builder vai ser o cara que vai construir todas as permissões de um usuário ali no momento que a aplicação e foi provocada ela recebeu a request né e aqui ela não retorna nada tá aí eu vou fazer o mapeamento roll permissions map que vai ser do tipo
record passando roles do Prisma e define permissions Para quem mesmo trabalha com JavaScript tem dúvida de um record é apenas um objeto padrão do JavaScript Então isso aqui significa que ele vai ser um objeto em que eu vou passar tem até o auto complet ó o admin vai ser aqui vai ser sempre uma roll e eu tenho a função essa função para poder determinar o que eu quero Então aqui eu recebo usuário e builder certo então aqui eu vou receber o usuário e o builder eu vou quebrar ele numa variável chamada de can Aí eu
posso falar assim can manage all Tá vendo que tudo tá tipado aqui em cima e aqui o all posso colocar post user ou all Então aqui eu acabei de falar que o admin pode manusear tudo Então eu tenho essa função eu posso fazer determinados quantos cans eu eu quiser Eu tenho cannot para poder negar também que eh às vezes eh a gente tem que fazer as permissões negando Eu posso determinar isso aqui como mapeamento a gente já tá num nível bem mais avançado mas se eu quisesse usar o castle é sem fazer o mapeamento de
rolls como eu tô fazendo aqui eu poderia tá então tem muitas formas de trabalhar Então vamos colocar no caso do editor agora A o editor é a mesma coisa O editor ele pode criar um post ele pode ler post e ele pode fazer update em post Tem também quem quem mais que tem tem o escritor O escritor ele não pode criar na verdade ele ah pode criar obviamente pode criar Ele pode ler e pode fazer update também Já o reader só pode ler Então vamos deixar dessa forma aqui Ainda assim aqui não tá contemplando a
questão de ah eu só posso eh eh ler publicado e algo assim mas a gente pelo menos criou um mapeamento que fica aqui bem legal de entender o que que está acontecendo né então esse servicinho aqui nosso ele vai ter uma dinâmica a proposta dele é um pouquinho diferente de um serviço convencional por exemplo desse user service aqui que ele acaba sendo uma instância shared que a gente chama no nest Quando a aplicação inicia é só uma instância desse serviço que vai ser gerada Então é a gente pode falar até que ela é uma singleton
né esse serviço não porque ele pode ser chamado toda vez ele pode ser gerar uma instância nova das habilidades do usuário toda vez que recebe uma nova chamada tá então a gente vai criar aqui um método chamado de create for user Eu vou passar o usuário autenticado Então eu crio aqui a instância do builder que vai ser um new ability builder passando aqui como tipo né que é habilidade nossa que tá determinada aqui em cima Esse aqui são as habilidades que é a mistura das ações e das permissões E aqui eu tenho que passar um
tipo que é o create Prisma ability E a gente vai ver daqui a pouco como que esse cara vai nos ajudar para essas situações mais específicas mas a gente não vai fazer um uso mais apurado dele agora Então eu criei instância aqui Aí eu chamo o meu role permissions map passando user role com o usuário e o builder Que que isso aqui vai fazer se eu passo o usuário aqui eu estou pegando qual é a rol correspondente ele vai acessar tudo isso aqui é uma função Todo esse mapeamento é uma função Então eu passo o
builder e ele cria a permissão para mim Isso aqui é um design pattern builder que a gente vai criando um objeto complexo com várias linhas normalmente muitas vezes usa métodos encadeados né enfim Então aqui eu vou retornar um builder pbild e ele cria para mim o objeto das habilidades e eu posso autorizar o usuário tá mas aí eu posso guardar essa habilidade que vai ser do tipo appility nessa variávelzinha aqui ó Então posso guardar antes nela e retornar para poder ficar mais fácil o uso Tá show de bola A questão agora a questão agora é
onde que eu vou usar e como eu vou usar esse serviço Eu posso usar esse serviço numa espécie de decorator Como é muito importante que vocês entendam isso aqui ó Eu posso passar aqui em vez desse required roles por exemplo um eh required permission posso colocar create post certo aí eu posso ter um castle guard que vai extrair as informações desse decorator Seria basicamente assim ó Create for user E aí eu tenho aqui o can Aí aqui eu passaria as duas informações os decorators no meu guardião Eu poderia usar dessa forma eu não vou implementar
Por quê porque eu vou mostrar aqui um nível de autorização muito mais profundo tá vai ser muito mais abente permitindo que uma refatoração nas permissões não afete a nossa aplicação tá então que fique eh entendida essa parte aqui Vou até deixar comentado Enfim como esse serviço eh ele sempre vai ser chamado é como se fosse autenticação que sempre eu tô verificando toda a chamada que acontece Eu vou passar aqui uma mudança para esse injectable que vai ser o scoping scope request Então esse serviço aqui agora ele vai ser gerado uma instância por requisição tá aí
aqui no módulo eu tenho que fazer o export dele para poder usar ele em outros lugares Certo aí deixa eu pensar como que a gente vai usar Eu tenho que importar ele lá na parte de autenticação Eu poderia na verdade tornar ele global também É a gente vai tornar ele global porque não tem necessidade de ficar importando ele em outros lugares tá então agora aqui no meu alf guard depois que eu tenho a instância do usuário olha só eu vou receber aqui o meu castle ou vou chamar de ability service que vai ser castle ability
service Então depois de pegar o usuário eu faço this ability service create for user passando usuário Então no momento do meu guardião eu já defini as habilidades desse usuário Ela elas vão estar guardadas nessa variável aqui Então eu posso chegar por exemplo vamos pegar primeiro a parte de users Eu posso pegar esse ability service aqui e fazer agora a minha autorização dentro do meu serviço porque a gente vai ter ganhos né uma vez que eu coloco essa autorização dentro do serviço e a gente tá vendo que ela vai ser mais específica esse serviço ele pode
ser reutilizado em outros lugares Então eu já garanto a proteção porque quando eu coloco eh umback né deixa eu tirar esse gerente daqui Quando eu coloco back no controller ela pode me servir até um certo ponto A gente já tá vendo que vai ter refaturação então eu quero algo bem mais abrangente Então já fica protegido Toda vez que eu chamo esse serviço independente do lugar não interessa não preciso me preocupar em proteger mais porque daqui a pouco se eu usar esse serviço como num consumidor que tá consumindo uma mensagem de algum outro lugar ou algo
assim eu vou ter que lembrar de fazer essa autorização de novo né então ela já vai estar aqui Então o que que eu posso fazer aqui primeiro vou pegar a habilidade que já tá construída lá pelo nosso guardião né então aqui eu verifico se o usuário tem permissão de criar um usuário Ou melhor se ele não tem unautorized melhor verificar aqui se não tem para não ter um else aqui ó e dificultar o nosso código Vamos ver Que que vai acontecer disso aqui a gente construiu bastante coisa né pronto Então agora vamos gerar um novo
token aqui pro reader Cadê eu tenho token pro reader aqui ó Tem né ó gerei um token pro reader Eu vou tentar criar aqui um usuário passando o token aqui ó Token reader Eu não ajustei o erro né não ajustei o erro mas olha só a gente pode depois isso aí seria uma refinamento aqui da aplicação mas eu não consigo mais fazer a minha chamada Agora se eu passo aqui para admin toque em admin eu vou ter o erro 500 mas agora o erro ele bateu lá no banco de dados e por causa que eu
tô tentando criar um usuário com o mesmo e-mail né aí já é outro problema a gente conseguiu passar com o usuário administrativo Então olha só que legal olha só que interessante né eh fazendo dessa forma aqui eu já garanto a proteção do meu serviço Se mudar as regras vai mudar a regra exatamente nesse arquivo só aqui né e aqui vem uma discussão interessante que eu gosto de pensar nela justamente o que eu venho falando aqui para vocês A gente fala de eh de core business e de preocupações tarefas ortogonais Quando a gente tá pensando em
core business justamente ah eu tenho uma aplicação de posts né eh criar esses posts eh administrar os comentários e outras coisas assim Agora tarefas ortogonais é fazer os logs da aplicação fazer autenticação fazer autorização Então quando eu tenho uma autorização mais longe do core business ali que é aquele airback mais básico a gente pode até colocar essa autorização num controller demonstrando né que ela eh não tem uma relação muito íntima com car business Agora para esse lado que a gente já tá encaminhando é muito melhor a autorização ficar aqui porque ela tá fazendo parte né
quando eu falo assim ó eh somente autores podem editar seus posts A gente tá falando aqui não é só da regra de negócio mas tem autorização embutida Quando a gente tá falando somente gerentes podem aprovar empréstimos com mais de eh R$ 100.000 sei lá Isso aqui é uma regra de negócio mas envolve também autorização né então quando a gente chega nesse quando eh a gente vê esse nível aqui nós temos que buscar eh a somente aqui o workback não vai satisfazer porque o back é só permissão e roll não analisa o objeto em si o
recurso em si que você tá acessando né se você tem um cenário desse aqui ah somente os autores podem editar os seus posts vai acabar colocando uma regra específica além da role e da permission específica ou dependendo da situação criando infinitas roles o que você acaba se perdendo também né enfim Então a gente já viu que já funcionou aqui Vamos transmitir lá pro post também Eh deixa eu pegar aqui ó Então pro o restante do usuário aqui eu não vou fazer mais nada Aí vocês podem fazer como dever de casa Eu vou me preocupar com
o post Então primeiro venho aqui com o ability server Ability server ou melhor castle ability server né tô abreviando aqui a variável mas ability service né não é serve Então aqui vem a mesma história mas aqui vai ser post Beleza aqui tá fácil né agora e aqui aqui como diria o outro lascou-se né aqui eu tô querendo ler posts Se eu fazer dessa forma eu caio no mesmo problema de novo porque eu tenho reader que só pode ler posts que estão publicados E aí e aí pessoal como é que faz como é que faz a
gente tem que trabalhar mesmo aqui com Castle por isso que não adianta só você usar a lib né você tem que saber também conheça os modelos de autorização os principais modelos que é o que eu tô passando aqui na aula para vocês Até o momento ainda assim a gente tá utilizando o backback mas para esse cenário que a gente quer nós temos que utilizar o wayback que é o attribute based access control E esse modelo de autorização é que é o controle de acesso baseado em atributos Eh enquanto ock olha para papel de usuário e
permissões aqui nós vamos olhar contexto nós vamos olhar atributos Eu posso olhar o atributo do recurso que eu estou acessando como post Eu posso olhar o contexto também do acesso Por exemplo eh se eu tivesse um cenário que médicos somente somente médicos eh no hospital podem eh acessar prontuários por exemplo Prontuários aqui já envolve um outro cenário ainda né porque eu tenho que ele tem que ser médico e eu tenho que ver se ele tá em horário de trabalho Então o ele é um um modelo de autorização muito abrangente e ele vai permitir que a
gente organize isso aqui Então na verdade o que que a gente vai ter que ter aqui ó eh eu posso colocar o Castle já permite trabalhar com ele não fala isso Por isso que é importante você conhecer porque eh hoje você tá trabalhando com essa LIB amanhã essa libre você vai usar outra libra linguagem de programação outro framework Se você conhece os modelos de autorização você vai saber trabalhar com autorização Agora se você tá ligado à LIB a forma dela de trabalhar e não sabe os fundamentos por trás aí não adianta Então por exemplo aqui
no caso do reader ó eu vou colocar aqui esse terceiro parâmetro é o condition Eu vou colocar o published igual a true Posso colocar aqui no writer ele só pode ler posts que sejam dele Isso aqui é legal porque eu consigo pegar o usuário Então eu crio aqui um autor ID é igual a user ID Aí eu tenho que lembrar que eh isso aqui vai ser analisado o objeto que eu vou passar paraa autorização tá maravilha Aí quando eu pego então o post aqui nesse caso aqui é ainda um problema porque olha só eu vou
pegar uma lista de posts né olha só o problema de novo Eu vou pegar uma lista de posts Então eu pegaria aqui uma lista de posts para poder varrer ou filtrar né poderia fazer aqui um filter post Aí eu posso passar assim ó Ability can read Passando o post Aí seria assim ó Eu posso passar a instância do post aqui Ele tá cheiando por causa da do tipo Aí dá para passar um n aqui Eu posso passar o objeto porque aí ele vai analisar ele vai analisar isso aqui ou isso aqui No caso dependendo né
da permissão do usuário Mas pensa isso aqui também não seria nada produtivo Poxa eh eu vou consultar todos os posts para poder filtrar Tá vendo que a gente acaba caindo em armadilhas tá usando uma lib tá feliz que tá ficando organizado mas aí você já começa a fazer coisas que vão dar errado depois né aí você joga isso aqui em produção fica lento porque você tá constando todos os posts para poder pegar somente os que o usuário tem acesso E mesmo assim essa regrinha aqui que aceita agora o objeto não tá servindo de nada Ela
serviria aqui pro find né consultei Aí eu posso pegar o objeto e passar Não seria melhor eh eu já arrumasse uma forma de consultar os objetos que eu preciso já de uma vez porque se eu já tiver se eu usasse essa esse condition aqui para poder consultar já resolveria o meu problema E é o que eu posso fazer com Cleon E no caso ele tem esse suporte pro Prisma mas você pode habilitar para outros ORMs Ele não tem o suporte nativo mas dá para habilitar Inclusive lá no curso da Full Psych eu mostrei como fazer
para um outro ORM que é o Type URM por exemplo Enfim eh você consegue fazer esse suporte tranquilamente Aqui em cima nós vamos ter que colocar mais uma vírgula que eu vou passar um prisma carry tá mais para trás nós instalamos o Castle Prisma que é a parte do Castle que se integra com Prisma porque ele vai conseguir eh permitir que a gente faça essas consultas no modelo do Prisma Então aqui agora a minha habilidade da aplicação eu consigo fazer essa consulta Beleza acho que aqui agora talvez eu até tenho auto complete É eu tenho
auto complito aquele prisma carrer Que legal eu consigo fazer or eu consigo fazer Então eu consigo criar aqui uma condição conforme eu preciso Certo aí agora na hora de fazer a nossa consulta olha só o que vai acontecer aqui hein a gente vai pegar a habilidade Eu não preciso verificar a habilidade mas aqui no finding eu vou passar assim ó o where para poder fazer a minha busca Passo end com array E aí eu tenho o accessible buy que eu importa lá do Prisma Castle passando a habilidade E qual é a ação que eu quero
capturar ponto post Então o que que isso aqui vai fazer baseado na habilidade que ele já montou pro usuário que seja admin editor writer e tudo mais ele vai extrair a condição se tiver Se não tiver não tem problema Ou seja se eu se eu for um admin isso aqui não vai retornar nada Agora se eu for um writer ele vai retornar isso aqui mas eu abstraí Não importa qual tipo de usuário é Então eu não preciso nem verificar antes se ele tem a permissão de ler porque eu já tô filtrando com as restrições do
usuário o que ele pode ler que é muito mais eficiente que eu só busco o que ele precisa o que ele pode na verdade né então vamos lá Deixa eu até rodar aqui a aplicação novamente Show de bola Então eh vamos lá Eu vou pegar aqui o login do admin vou deixar ele aqui Login reader Aí agora eh vamos criar um post token admin Eu quero criar um post pelo menos que está false que não tá publicado né bom então tá eh não está publicado Se eu for consultar os posts quantos que eu tenho eu
tenho três no momento Então eu tenho dois que estão dois que estão publicados e um que não está O admin tem acesso a todos Agora se eu trocar aqui para token reader eu só vou ter os dois posts que estão publicados Vamos tentar ver no banco de dados como que isso está sendo executado Ah cadê vamos pegar aqui o prisma Não deixa eu fechar esse tanto de coisa Tô deixando tudo aberto aqui tá ficando difícil para poder mexer né aqui ó para poder fazer log das cares no Prisma Service Colocar aqui um constructor Até ele
me ajudou aqui ó Posso colocar também aqui error Quando eu coloco aqui carry ele vai logar para mim as cares que estão sendo feitas ó Então vamos fazer de novo ó Se eu passar aqui um token admin olha a carry que ele executou ele fez um select asterisco from e aí ele coloca esse where 1 ig que é uma forma aí que é usada nos bancos de dados para poder acelerar a carry Ela acaba trazendo a carry com mais performance Mas veja só eu não tenho nada no we porque eu sou administrador Eu tenho alguma
coisa eu tenho alguma regra para post aqui não É porque ele vai tentar pegar um read a ação read de post Agora para o leitor vai ter Vamos ver Então aqui vai ser token e aí mudou a car Então o meu where vai ser onde post published é igual ao aqui a não é concatenado né é passado o valor Então aqui sim ele tá pesquisando Então olha que legal isso Independente do tipo do usuário que tá acessando a aplicação eu já tenho a restrição pronta Nesse mapeamento que eu fiz aqui A gente tá usando o
né porque tanto aqui quanto aqui a gente tá trabalhando com o modelo doback que eu estou trabal analisando os atributos do recurso Eu posso analisar atributos de várias outras coisas também que eu quiser mas eu já analiso direto aqui Ah mudou alguma regra agora sei lá o leitor pode fazer qualquer outra coisa Pode ler posts que não estão publicados também Eu só tiro aqui Vai mudar alguma coisa no meu find nada absolutamente nada E é esse o ponto quando a gente trabalha com a autorização você precisa entender a aplicação que você tem e o modelo
que você tem que trabalhar Para esses esses casos seria muito importante trabalhar com eh Wayback né e aqui já eh criando uma consulta dinâmica pegando as informações do próprio usuário Então aqui também ó dá para poder fazer na consulta de um só dá para poder fazer a mesma coisa Como que ficaria o find aí ele ficaria um pouquinho mais restrito A gente colocaria aqui endable buyando a habilidade que na verdade deixa eu colocar ela aqui em cima para ficar ficar uma linha muito grande E aqui eu passo habilidade Então a minha consulta agora tem uma
regra mais complexa mas ela não se afeta porque as mudanças aconteceram na minha aplicação Então o que que vai acontecer aqui agora ao mudar isso aqui vamos mudar para token admin Vamos pegar o ID desse post que o usuário reader não tem acesso Então aqui na verdade eu posso deixar esse aqui e criar um novo né aí aqui eu passo tokener tokener E eu consegui ter acesso Pera aí Então ele não pegou a informação do usuário correta porque até a carry ele tá pegando o ID e end igual a 1 Passei aqui o ID aqui
Tá certo porque a de cima ele tá pegando né deixa eu passar aqui Tkener tá pegando Pera aí eu fiz alguma mudança que lascou-se tudo Pera aí Ah porque eu tirei né aí o erro é meu Estranho né agora se eu tentar acessar esse aqui ó Tá vendo que não veio nada por quê eh quando ele vai fazer a consulta ele vai consultar onde o post ID é igual a ID que foi passado e é publicado né então na verdade isso aqui vai retornar um nu E aí eu poderia muito bem chegar aqui no meu
get aqui ó fazer uma mudança para poder melhorar a minha API Então aqui eu coloco eh a se não tiver post aí eu posso retornar um not found Not found exception Caso contrário eu retorno post É porque aí agora ó olha que bacana isso né eu não tenho acesso ao post Eu deveria informar um erro 403 Você não tem permissão para poder acessar esse post não ele não existe no seu contexto Isso até ajuda que a gente tenha um uma segurança melhor na linguagem da nossa API porque eh muitas vezes você vai ser incentivada a
retornar esse 403 aí a pessoa não tem acesso e ela ah então esse post existe eu só não tenho acesso a ele Aqui não aqui você não deixa claro né não para você não existe Seria mais adequado É isso né eh muita gente às vezes não entende que eu ah mas o 404 a rota existe no meu framework Não 404 você tá analisando se aquele recurso está disponível para aquele cliente que tá acessando Nesse caso eh não tá disponível para ele Então ele tem permissão de ler né ele tem permissão de ler A não ser
que se eu tivesse um cenário em que tivesse usuários que não tivessem permissão de ler aí eu poderia fazer antes aqui um se não pode ler post tá aí eu poderia retornar aqui um unauthorized aqui retornaria um 403 Aí é o modelo que você tá trabalhando mas nesse caso todo mundo vai ter permissão de leitura Não preciso fazer isso aqui Eu posso até deixar como uma me antecipando já a uma mudança futura Enfim Eh pro caso aqui do update também ó como que ficaria então primeira coisa vamos pegar a habilidade do usuário Aí eu vou
ter que seria bom aqui consultar para ver se o post existe antes Seria bom de de pré antes de fazer eh update Ó vou copiar essa partezinha aqui Então aqui vem post é igual comweight então tento consultar Caso contrário eu vou manter a coerência da minha aplicação Se eu não conseguir consultar o post ou porque ele não existe ou porque o usuário não pode ler ele Ou melhor aqui é update né eu tenho que ver se ele pode fazer update Então aqui ó eu posso ler posts que estão relacionado comigo independente do que seja mas
eu só posso fazer se eu for escritor eu só posso fazer update em posts que estão relacionados comigo também Então aqui eu já estou consultando vendo a regra do update Aí se tiver tudo OK passou eu consegui consultar e ainda com esse CAS eu não vou mostrar mas se você pode olhar lá na lib a gente poderia colocar aqui ainda no update por exemplo um um terceiro parâmetro Vai que seja o editor né o editor só pode eh fazer posso passar um array ele só pode editar o conteúdo e não o título Isso aqui cai
noback também Sempre quando eu estou analisando atributos eu posso eu posso fazer esse tipo de chamada mas aí eu tenho que fazer ã uma análise aqui do objeto em si mas daria para poder fazer também dessa forma Mas o ponto é sempre que a gente acaba criando aqui um modelo que vai minimizar muito as refatorações e manutenções né então olha que legal isso aqui né já estou consultando já sendo objetivo para ver se eu posso pegar aquele objeto com a permissão de update Eu não consulto ele desnecessariamente para depois analisar Então quando você consulta já
com essas regras a gente tá misturando né a a autorização ela tá fazendo uma simbiose com a nossa regra de negócio Consegue entender isso aqui que tá sendo feito né aqui pro caso do update também ó Quer dizer pro remove posso copiar isso aqui ó Aí eu tenho que colocar aqui Aqui vira remove No caso só o admin tem a essa permissão né olhando aqui ó somente o admin tem a permissão porque ele pode fazer um manage All manager tem todas as permissões existentes Qualquer outro vai acontecer o quê vai retornar o 404 porque você
não tem acesso a esse recurso Então quando a gente olha aqui pro controller ah eu poderia eh fazer uma pré-verificação também Nada impede Você pode colocar no seu controller ali uma pré-verificação para nem chegar no serviço e vamos supor que você tá tentando acessar ali a você tá autenticado mas você está acessando o recurso que você não tem autorização Aí não precisa nem de ficar fazendo essa consulta ou algo do tipo Então eu posso combinar também eu posso ter eh numa camada da minha aplicação eu faço uma uma validação mais eh não tão específica e
na outra camada faço uma validação mais específica Entenderam como que funciona isso e além disso eu poderia até pessoal isso aqui também é é interessante de colocar as regras de autorização no próprio token tá eu poderia fazer isso também se eu quisesse tipo ã vamos pegar aqui o Alf Service Se eu quisesse pegar aqui o ability service aí aqui antes de fazer as coisas ó eu [Música] pego a habilidade do usuário que eu consultei e a gente pode passar assim ó permissions Eh aí tem que ser aqui o como que é a libzinha como que
é o a parte do castle import Ability Acho que é pack Deixa eu olhar aqui na documentação que eu não acho que é na parte de extra né acho que é extra Barra extra Tem aqui o Não não é isso Pack rules Cadê a parte do pack é é eu acertei Só esqueci aqui do rules ó Verdade Aí eu posso colocar assim pack rules passando ability rules onde tem as regras Aqui dentro desse objeto tenho todas as as regras específicas Então isso aqui é também é um cenário legal Por quê quando eu logar aqui por
exemplo com reader que ele tem permissões mais específicas né com admin também daria para poder ver o men Vamos dar uma olhada no token Olha só você já tem as permissions que elas vão lá pro front por exemplo que você já poderia administrar esconder botão fazer qualquer outra coisa Mas como a gente confia no token JWT é um token seguro a gente sabe que ele tá assinado e as informações do payload não foram modificadas né eu poderia até tornar a minha aplicação mais eficiente porque toda vez que eu recebo a request eu crio a habilidade
a todas as permissões ali tudo bonitinho utilizando né eh Wordback e Aback a partir do usuário do banco de dados mas eu poderia pegar aqui do payload porque agora eu recebo aqui permissions também que vai ser uma na verdade isso aqui é o tipo é uma string com é uma array informações poderia já pegar as permissions do token e hidratar o meu serviço de habilidade sem ter que pegar do meu usuário ficarem muito mais rápido né porque aqui do usuário eh eu tenho que fazer essa execução apesar que isso aqui não é executado muito rápido
mas às vezes a gente pode chegar de extrair uma permissão do banco de dados também Às vezes a gente pode ter aqui um tipo de um permission Vou dar um exemplo aqui ó Vou colocar assim ó eh permission que ele não é obrigatório E aqui vai ser do tipo permission Isso aqui é um JSON que a gente vai armazenar no banco de dados por exemplo Aí eu vou ter que instalar aqui um tipo arbitrário que vai ser um eh prisma traço JON traço types traço generator menos save menos dev Vamos supor que a gente quisesse
colocar permissões dinâmicas pros usuários também Eh aí eu vou colocar aqui dentro desse Prisma eu vou tipar aquele esse permissions aqui para poder ficar melhor Vou criar aqui um index.d.ts Eh eu já tenho essas permissões aqui ó Então aquele permission ali vai ser esse permission Nós vamos ter um array que eu vou poder determinar a ação o recurso que eu quero acessar e as condições que pode ser um objeto aí com várias permissões chave e valor tá aí colocando essa permissão eu tenho que registrar isso aqui que eu tenho que passar barra prismaes Isso aqui
é a forma do prisma quando você tem o você quer tip né aí eu posso executar aqui o NPX Prisma Migrate Dev Não que ele vai executar nada no banco mas a gente só vai ter a ele vai criar o campo de permissão né ele vai adicionar aqui onde Jon B mas agora eu tenho a tipagem dele Então na hora de criar usuários vamos chegar aqui eh no DTO Posso falar ó que permission permissions eh não é obrigatório E aí tem que ser prisma JSON List Aí ele tipou para mim que fica fácil né de
lidar porque ele aponta lá para aquele lugar Então agora na hora que eu vou criar eh cadastrar aqui um usuário eu posso determinar essas permissões também Então eh eu posso colocar aqui eh eu já tenho os usuários criados não vou matar meu banco de dados Eh vamos criar um registro para o escritor que eu não tenho ainda né create writer Então aqui vai ser writer Eh writer writer writer Beleza Agora vou colocar assim ó permissions Aí eu tem que sempre lembrar do da tipagem Vamos pegar a tipagem aqui Index ponto jogar ela para cá Então
ó vamos supor que eu queira dar permissão para esse escritor aqui Eu quero dar ação de ler usuários Então o resource vai ser user e eu poderia passar uma condition também Poderia passar uma condition também Beleza acho que tá tudo certo Condition não é obrigatória Vamos criar aqui esse cara Se eu tiver rod Ah não tô rodando P Ele deu [Música] erro de qu aqui gerente Onde que eu enchi esse gerente acho que eu coloquei um gerente em algum lugar aqui que eu não devia Gerha explicado alguma coisa né e pior que será que eu
coloquei um gerente aqui não Ah o pior que eu coloquei um gerente Olha só Meu Deus Eu rodar de novo aqui O myrate dev Eu coloquei um gerente ali acidental tá então vamos rodar aqui a aplicação Show Então vamos cri vamos criar aqui esse registro Aqui tá faltando aqui tem que tirar essa vírgula Beleza Aí eu consegui criar Agora esse usuário específico ele tem o permission Aí o que eu posso fazer agora lá no meu serviço do Castle porque eu eu vou carregar também do banco de dados Eh eu pego não só da role do
usuário mas eu posso fazer assim user p permissions optional chain porque eu não sei se existe for it Para cada permission que eu tiver eu posso fazer um builder.Cen can passando permission pon action e permission pon resource e aí ainda tem permissionc se eu tiver alguma coisa agora o problema é que ele não tá pegando aqui né como que eu coloquei no coloquei permission Ele ainda não tipou a Deixa eu acessar aqui Às vezes acessando ele permission Se eu coloquei certo três hashtags Deixa eu reiniciar o S link É deixa eu colocar um comentário aqui
depois Essa questão de chipagem é isso é detalhe Aqui é link também não tem problema Então aqui tá além de carregar aqui do meu mapeamento agora é dinâmico né então eh vamos chegar aqui agora no user service Eh eu falei qual foi a permissão que eu dei pro Aí pode ler o usuário Então eu poderia fazer aquela situação que tá no post service eh aqui ó Coloco aqui e faço essa chamada Então aqui vai ser user Olha só que legal Então agora eh eu tenho que fazer o login também com o writer né esse arquivo
aqui tá ficando grande né aí mudou aqui em cima Aqui vira writer e aqui vira writer também Aqui para cima eu tenho ler usuários Acho que eu não tenho né aí dá para criar aqui embaixo Então get http 2 barra local host na porta 3.000 users Aí aqui eu passo primeiro vamos passar o admin consegue ler todos os usuários presentes Então tem o admin tem o reader tem o writer Agora a gente deu a permissão lá pro pro writer e eu não fiz o login com ele né eh aqui o login com ele Aí o
o writer consegue ler as Ele consegue ler Vamos testar aqui um outro usuário que é o token eh reader Tá vendo ele não pode ler Aí aqui ele deu esse forbidden error mas se eu quisesse fazer uma verificação antes né aí ficaria mais eh eficiente aqui ó Porque se eu fizesse a verificação se ele pode ler eu nem evito acessar o banco de dados de forma desnecessária né agora se eu faço aqui a a chamada ele já retorna o erro 500 a gente vê que nem teve chamada no banco ele já retornou ali o unauthorized
e aí eu só tenho que fazer a formatação do erro do erro específico Mas eh isso aqui que a gente tá fazendo permitindo que o usuário tenha uma permissão dinâmica permite que a gente trabalhe com o último modelo que eu tenho para passar para vocês que é a ACL né que acho que talvez é a mais conhecida junto com a com a backack Então a gente viu a backback que analisa os atributos a gente tá analisando ali né eh o autor ID o publisher pode até nesse contexto do pode até considerar que a RLE também
é um atributo E o ACL que é o action control list você vai encontrar a CL por exemplo eh em sistemas de arquivos né você vai encontrar isso na no Google Drive na S3 da Amazon que a ACL o o objetivo dela é conceder permissões em cima de um recurso A gente poderia considerar assim que um bar users genérico é um recurso sim mas quando a gente tá olhando mais pro recurso tá você quer e liberar para um arquivo ou para um registro específico né então pense que nesse nível aqui de colocar a permissão de
forma dinâmica a gente poderia criar um usuário ou ficar adicionando permissões para ele por exemplo eh ele pode fazer ele pode fazer um update em post onde o ID do post é igual a sei lá um qualquer coisa assim né então a gente tá concedendo eh uma permissão em cima de um recurso específico né entraria a questão da CL Nesse caso como a gente tá trabalhando com autorização num sistema ela teria que ser dinâmica né eh dificilmente você colocaria um valor um aid dinâmico aqui seria algo muito raro então teria que ser dinâmico Então eu
coloquei essa essa permissions pra gente poder eh conceder e ABEC e ACL porque eu posso analisar qualquer atributo mas eu posso direcionar em cima de um arquivo Entende o que eu tô querendo mostrar aqui agora veja com tudo isso que nós fizemos né se as regras mudam vai mudar no banco lá vai retirar alguma permissão do usuário mas tudo isso que a gente fez trabalhando com esses três modelos em conjuntos modelos de autorização eles não são excludentes eles são combinados A gente combinou os três aqui né vendo essa combinação eh pra gente poder ter uma
autorização para poder atender a essas regras de negócio né então eh quando eu pensei em fazer essa live aqui eu justamente tava fazendo a parte de ALF lá do FC4 que eu gravei recentemente foi poxa eu vou levar esse conteúdo com Nest né que vai ser um bom resumão do que eu tô eh fazendo lá No caso do curso são 10 horas né de gravação mas aqui eu mostrei também um pouco do que a gente tem lá É muito importante que a gente entenda esses modelos conheça-os que é aquilo que eu falei se você fica
pegado a biblioteca não entende os fundamentos por trás você está fadado a não conseguir resolver esses problemas de autorização de espalhar essas regrinhas e ficar um emaranhado pelo código afora que ninguém mais tem confiança o que vai acontecer né você vai cruzar os dedinhos quando essas mudanças acontecerem e vai trazer prejuízos imensos à empresa porque usuários que não deveriam ter acesso às coisas vão acabar tendo acesso É isso pessoal Deixa eu fazer aqui a geração do repositório Pera aí Eh uma live imersão 22 NJS Alf eh back aí tem uma pastinha escondida aqui que fica
rastreando mudanças de código minha Deixa eu colocar ela que senão vai acabar indo junto Então first commit git push orange main Tá aqui Está aí pessoal O código fonte é disponível para vocês poderem acessar já na faixa Vamos ver aqui Tô cansado de falando aí 3 horas Deixa eu ver Podem mandar perguntas aqui para eu poder responder para vocês E aí nesse caso ainda né eh a gente vê aqui como que pode ser necessário não ficar carregando as permissões aqui da do banco algo assim pode ser mais eficiente carregar do token mas aí depende também
se vão ser muitas permissões Colocar no payload do token é um problema porque aumenta a latência de rede porque esse token é trafegado o tempo inteiro Então não existe eh nenhuma escolha definitiva Você precisa aprender os fundamentos e entender os contextos e adequar os contextos Depois eu dou uma olhadinha nessa questão aqui da das permissions mas eu acho que eu fiz alguma coisa errada aqui Apesar que a tipagem tá certa né deixa eu ver se o nome tá certinho É pior que tá É o Prisma me trollando aqui de alguma forma É a gente não
vê nada eh hard coded né você vê aqui que não tem que essas regras específicas ficam no banco e as regras genéricas ficam nesse arquivo Poderia separar no arquivo enfim fazer outras coisas É pode ser que seja o VS Code também É eu tô com a versão Insider né que eu tinha falado a versão Insider inclusive já tem aqui ó um update Tá vendo que eu falei eu hoje eu já tive um de manhã então já é o segundo update do dia Eles vão mandando update o tempo inteiro então você corre o risco de quebrar
o o a IDE né pessoal valeu pelo feedback O Mateus falando que eu expliquei muito bem que abriu a cabeça Show de bola Ah o Peco falou aqui algo eh interessante inclusive minha esposa tá não sei se vocês viram aqui né mandando mensagem para mim se eu terminei Recebi intimação aqui Daqui a pouco eu tenho que terminar Deixa eu descompartilhar a tela aqui O Peco falou aqui uma pergunta interessante ó Como ficaria se eu quisesse deixar as roles dinâmicas para um admin da aplicação criar mais rolls eu poderia vir no código e colocar mais configurações
É essa aqui é uma boa questão Acho que eu vou voltar mais uma vez aqui Assim essa questão de rolers dinâmicas eh a gente poderia ter nesse formato aqui Aí o que mudaria que ao invés de você ter esse mapeamento eh você iria fazer uma consulta aqui no banco para poder fazer toda essa montagem né então poderia se criar as rolas dinâmicas mas o que normalmente acaba se fazendo tem que tomar cuidado se a sua aplicação precisa disso Você pega grandes aplicações tô usando essas grandes aplicações como referência eh normalmente elas não permitem essa criação
dinâmica ali de rolers né elas acabam sendo coloca hardcoded no código mesmo tá mas se ela se precisar de fato de ser dinâmico eh você carrega aqui né na hora que você vai montar E aí entraria aqui uma outra estratégia também se ficar montando toda hora é ruim ou ficar pegando do payload do token o token tá aumentando eu poderia trabalhar com cash também poderia criar um cash dessas informações e aí carregar toda vez que esse usuário está acessando a aplicação também Eh W fez uma pergunta aqui Tem como através dessa liber técnica de workflow
exemplo sou um autor porém um perfil para publicar que dependa de revisão autorização Você quando você tem essa esse cenário aqui eh de você ter um um análise mais específica você pode trabalhar com uma pollice Eh você pode criar por exemplo uma classe que quando você quer dar por exemplo uma fazer algo em um recurso você pode passar uma malha de objetos aí essa pollicey ela faz várias análises né normalmente por exemplo assim você pode criar um se eu tiver algo muito complexo posso criar um post policy essas regras entendeu aí você coloca aqui a
ação né que você quer testar can por exemplo action qualquer Aí você passa a malha de objetos aqui e faz a sua verificação [Música] Eh o Leandro falou: "Conteu tá de parabéns." Muito obrigado Que mais show de bola pessoal Depois eu vou dar uma olhadinha nesse erro aqui para ver se é um erro de fato né um erro de tipagem que não é que não atrapalha o funcionamento do código Mas vocês já abriram ali né até abriu o zap aqui da minha esposa perguntou terminando Daqui a pouco pode vir aí o um puxão de orelha
Então já vamos pro final aqui Então é isso pessoal Isso que eu tinha para passar para vocês né espero que a live tenha sido produtiva 3 horas mais 3 horas de live considerando aí o início que e a gente gastou ali uns 11 minutos eh batendo papo Então foi 3 horas exatamente de live Foi muito legal né eh a gente tem muito conteúdo de NEST aqui no canal Eh Nest com Multitênesse N autorização autorização primeiro conteúdo que a gente tem aqui criando API rest eh consumindo rapq a parte cáfica enfim tem de tudo que você
pensar Então dá para você poder digitar Nest aí e ter um horas e horas de conteúdo para você poder aprender né recomendo que você veja bastante o canal FC Lembrando essa live vai ficar gravada no canal as outras lives também da semana ficam gravadas A gente não retira então pode ficar tranquilo mas recomendo que você veja todas as lives Ontem já teve a do Wesley hoje está tendo essa E amanhã tem mais outra live você eu que vou ministrar Vai ser live sobre a Pach Cafica também é live inédita a gente não tem conteúdo disso
aqui no canal que é sobre Kafka Streams E sabe o que a gente vai programar amanhã na verdade vai ter Java Vai ter Java não sei se vocês sabem mas Java foi a minha primeira linguagem profissional Então amanhã vai ser legal também porque CAFCA vai ser mais uma ferramenta que a gente vai usar nesse estudo de caso Todas essas tecnologias nós vamos utilizar Então continue acompanhando né recomendo que você se inscreva no link que tá abaixo na imersão porque começa dia 7 de abril e aí você vai ser notificado de tudo que vai acontecer vão
ter os vídeos pela manhã que eu Wesley publicamos para construir ali o gate de pagamento Vai ter o dia do Nest o dia do Goleng eh vai ter o dia do CFC o dia do Front End também Front End a gente vai ver na sexta-feira Então não deixa de se inscrever mesmo tá e também dê um like nesse vídeo que nos ajuda bastante Eu vou deixar aqui minhas redes sociais se você quiser entrar em contato comigo quiser me adicionar aí ó @argentinaloiz aqui no cantinho ó Pode me adicionar aí Twitter GitHub Instagram tudo é @argentinaloí
tá puder ajudar em qualquer coisa estou à disposição de vocês Paulo Scot falou: "Java é bacana" O Leandro fala: "Java Cafica" Pois é Java e Cafica combina porque o Cafica é feito em Java né então casa muito bem Inclusive eh a gente vai até ter uma a live da de Kafca ela é inédita porque o Cafkaa teve uma mudança que agora ele não precisa mais do Zeper para funcionar como server discover ele trabalha eh como eh um controller ali também Então isso é uma mudança recente mas depois a gente fala mais sobre isso Show de
bola pessoal Então o código fonte tá disponível Depois eu peço pro pessoal adicionar aí na descrição Foi um prazer aí para quem tá me vendo pela primeira vez né se vocês puderem me seguir contribuir com o trabalho seguir o canal eh curtir agradeço demais Então estudem bastante e vamos seguindo aqui a trilha que com certeza a gente tem mais conteúdos Descansem bem e coloque o conteúdo em dia Até mais Tchau