quem precisa apenas do refresh token pode pular para 52:37 mas caso esteja aprendendo node e interessante ver o video inteiro pois mostra todo processo de criar uma autenticação
cara no video ela usou uma variavel com um certo nome e depois se arrependeu. 23:45 dai ela selecionou tdas simultaneamente e alterou. Como faz isso??? Eu sempre altero uma a uma na mao kkkkkkkkkkkkkk
A ideia da aula é implementar Refresh Token, mas deu muita volta e explicou muita coisa desde criar uma api do zero, pra quem está começando é ótimo, mas pra quem só quer ver sobre a ideia principal demora muito, era bom ao menos colocar a linha do tempo pra quem quiser pular só pro conteúdo principal poder pular.
Que aula maravilhosa, assisti todinha. Já que a Dani saiu, alguém da Rocketseat poderia refazer esse mesmo vídeo de refresh token mas usando NestJs, Postgresql e prisma. 😊
Lembrando que autorizar um refresh_token já expirado pode trazer uma brecha na segurança, o ideal é gerar um novo refresh_token sempre que o atual for utilizado e se o atual estiver expirado retornar um erro de refresh_token expirado.
@@fernandoalcantar4 exatamente, se o refresh token é válido, gera um novo token e um novo refresh token, se não for mais válido retorna erro 403 unauthenticated e sucesso.
@@MuriloHenriqueA por exemplo o refresh token venceu apos 3 minutos ai automaticamente ja muda pra um atualiza um novo token de acesso e um novo refresh token? e fica nessa rotaçao de token infinitamente? isso nao sobrecarrega o sistema nao com novas solicitaçoes todo minutos?
@carlos.chea interessante seu jeito de pensa no último comentário aqui, mas se o cara que tiver acesso ao banco souber qual o modelo de criptografia, ele vai poder descriptografar
Galera a rocket, o conteúdo de vocês são muitos bons, só uma ideia, seria da hora vocês (no caso de vídeos como esse, que usa conceitos) colocar uma espécie de diagrama, não sei se é essa a pegada do code/drops mas certamente ficaria mt bom pra ensinar sobre refresh token, já que ele é um conceito, i.e. vai além do código.
Fiquei apenas com uma dúvida: qual o sentido do access token ter um tempo de expiração, se ele sempre será automaticamente atualizado pelo refresh token? Se um usuário malicioso conseguir roubar nosso token, imagino que o tempo de expiração serviria justamente para impedir a utilização discriminada do mesmo. Porém, se o usuário possuir o token e se passar pelo alvo de quem o roubou, o refresh token não enviaria um novo access token assim que o anterior expirasse? O atacante não teria, então, acesso constante às informações de seu alvo?
Isso não aconteceria pois para criar um novo access token e necessário antes validar o refresh token, ou seja uma pessoa que tem apenas acesso ao nosso access token não conseguiria criar um novo acesso token já que pra isso também é necessário ter o refresh token
Bem legal o vídeo, pena que não veio antes de eu implementar em um projeto que estou trabalhando kkkk eu não concordo muito com a parte de guardar os refresh token no banco de dados, eu acho que isso meio que tira o sentido do JWT mas é muito melhor na hora de invalidar as sessões do usuário parabéns pelo ótimo contéudo
Desculpe se a pergunta é básica, mas a forma que a API foi organizada, como por exemplo usando os Casos de Uso (pasta "useCases") se refere algum padrão específico de arquitetura? Achei bem interessante.
Nao precisa renomear cada arquivo, no vscode é só você apertar f2 com o que você quer alterar selecionado que ele já altera em todos os lugares que utilizada aquilo
Salvar os refresh tokens no banco de dados dessa forma não seria uma falha de segurança, visto que um funcionário com acesso ou uma database leak faria com quem fosse possível acessar essas contas com o refresh token válidos no banco? Qual seria a solução? O Redis resolveria esse problema? E os refresh tokens expirados, só seriam apagados quando algum endpoint de autenticação fosse chamado?
Esse Refresh Token, eu posso armazenar ele no meu localStorage?? Sei que tem riscos de XSS attack, dai estou na duvida de aonde posso armazenar ele. Parabéns pela aula!!! Ótima didática.
Ai Dani top video, to direto mexendo com JWT e refresh mas ainda me bato em como interceptar no front quando o JWT expira, já fiz com o interceptor nas requisições mas achei muito ruim dessa maneira, seria daora um video sobre como interceptar no front a sessão invalida
Dani, você pode colocar a configuração (JSON), do seu VS Code? Vejo que sempre que você inicia um projeto, o seu lint já funciona normalmente, mesmo sem nenhuma configuração adicional no projeto.
Fiquei na dúvida no fluxo. Digamos que tem essa rota /courses. Eu devo passar refresh_token como middleware dessa rota ou ele tem que chamar a rota refresh_token junto com a courses?
Colocando a função ensuredAuthenticated como middleware, a unica coisa que você precisa fazer na requisição é colocar no header authentication da sua chamda HTTP o bearer token
Ficou um pouco confuso no final haha. Mas foi. Tenho uma dúvida: Em que exemplo de cenário o usuário teria vários refresh-tokens salvos? Utilizando dessa forma de guardar eles num banco, não teria muitos dados sem uso?
Em minha experiência sim, para auditoria e uso interno, como tracking é interessante, mas pra aplicação não faz muito sentido. Aí pra resolver isso eu recomendo usar dynamodb com time to live ou um redis. Qualquer banco de dados com expiração do registro já acho uma boa. Muito boa a pergunta por sinal.
O problema que eu vejo utilizando o token na minha aplicação é que, se por um acaso alguém tiver acesso ao token e ao refresh token de outro usuário, essa pessoa mal intencionada tem da mesma forma acesso irrestrito à conta da vítima. Dependendo da forma que o refresh token for gerado, e sua data de expiração, pode acarretar em problemas gravíssimos. Comecei recentemente a me preocupar bastante com a questão de segurança num projeto que estou desenvolvendo, e como foi falado num PR que envolveu serviços de segurança, creio que a melhor forma de deixar a aplicação realmente segura é com 2FA ou com verificação por IP, pensando na ideia de trabalhar com jwt
usando um refresh token como este, você só poderia ter uma sessão ativa, certo? Caso um usuário tenha mais de um dispositivo, como ele pode permanecer conectado em ambos sem sair? Muito obrigado, sou fã dos seus code drops!!! saudações da Argentina
O refresh token deve ser único por dispositivo. Da forma que ela implementou, você está correto, só há como manter logado um dispositivo, mas isso pode ser facilmente alterado permitindo salvar mais de 1 refresh token no banco. A forma que você iria fazer dependeria da rua regra de negócio, você pode só permitir vários refresh tokens, você pode limitar por um número fixo, pode limitar por dispositivos e, por exemplo, dar nome aos cliente, tipo "web" e "mobile" e apenas permitir esses 2 refresh tokens, você também pode associar com o ip, pode salvar outras informações do dispositivo e por aí vai.
Caso queira manter o mesmo refresh token para múltiplos dispositivos, você pode buscar no banco e retornar ao usuário nos outros dispositivos, caso já exista um. Acredito que não seria uma boa prática, talvez alguém possa acrescentar.
No refresh token, além do id do usuário, ou nem isso, vc salva o id do registro do banco...então cada login é único e tem seu id refresh token próprio, além que dessa forma, vc tem salvar o dispositivo que acessou,
Gostei desse seu 'commitário'... 👀 🤣 Anotada sua sugestão! Pessoal pede demais por aqui mesmo! 💜 😛 Por hora, deixo esse vídeo que o Diego comenta um pouco sobre: *Prisma 2: Automatize o acesso ao banco de dados | Code/Drops #29* ruclips.net/video/2iS3SHwft0k/видео.html 💜 🚀
Dani gostei muito da explicação mas não pude deixar de notar que esse refresh token é muito inseguro, qualquer pessoa que solicite uma requisição com apenas com o refresh token consegue se autenticar, a solução para isso seria capturar o ip do user. Vlw!
È que você só tem acesso ao refresh token se fizer o primeiro login com usuário e senha. É claro que entre o tempo do login e da expiração, que deve ser curta, se alguem invadir seu browser e pegar o refresh token, ele pode ficar dando refresh e utilizando o seu login
Isso é uma questão de projeto, ela fez assim para facilitar as coisas, mas uma camada de reposítório é sempre uma boa escolha, já que as demais camadas não devem saber como está sendo feito o acesso ao banco, apenas chama os métodos e pronto. Repositório é apenas um padrão de projeto, que vc pode ou não seguir.
Sim, vc pode deixar no redis também, o importante é ter um mecanismo para saber se o refresh token é válido, ou seja, se alguém roubar seu token e seu refresh token, você precisa ter como revogar o refresh token, aí não consegue mais renovar o token, a não ser que o cara pegou seu usuário e senha, aí não tem jeito.
Tudo bom Dani? mudei um pouco, criei um middlewares onde verifico se esta vencido e atualizo setando no header, porem localmente funcionou normal setando, meu problema foi quando coloquei em um container em nuvem, parou de setar, eu acredito que seja tempo de resposta. já tentou fazer setando no header o token novo?
Comunidade de devs linda. Me tirem uma dúvida antiga. Se a idéia de fazer o token ter vida curta é pra aumentar a segurança no caso de um roubo de sessāo por exemplo. O refresh token nāo sofre do mesmo risco? Alguém nāo pode roubar o meu refresh token e recuperar um token meu. Alguém tem material explicando pq mesmo assim o refresh é o mais recomendado?
Isso é quase a mesma coisa que manter uma sessão no banco de dados, ainda prefiro manter os dados da sessão do que me preocupar em administrar isso(expiração/refresh, etc...), se salvasse de ler algo no banco de dados aí sim valeria a pena. O lance da sessão é q você pode por um id no token e de tempos em tempos, ou por qualquer critério que você achar melhor(troca de ip?), fazer a checagem no banco de dados, pode até comparar o userAgent pra dar um reforço, e quando o usuário deslogar vc apaga o id no banco e inválida o token, por conta do id dele não existir no banco de sessões.
@@naoseioquecriar olha, eu já estudei. E pode sim ser besteira, mas as respostas mais generosas são muito mais úteis q essa tua cuspida de palavras vazia.
@@lucas_badico já estudou? eu acredito que não; para vir com pergunta idiota é porque deve copiado/colado alguma coisa de um site e na hora de PROGRAMAR SÉRIO deve ter ficado perdido. Sobre a "cuspida de palavras vazias" ohhhh vou chorar aqui, com licença ahahahahahahah
Como armazeno de forma segura o 'refresh-token' no 'front-end', tanto para mobile ou web? Alguém pode indicar uma boa solução ou apontar algum vídeo que trate do assunto?
Depende do que se trata, se for uma aqui onde uma máquina vai utilizar não se deve usar o refresh token e sim uma chave de api. Como aqui é sobre autenticação você deve salvar o refresh token no db pra poder ter a função de deslogar o usuário
@@itxToledo mas refresh token n eh usado para autenticação, e sim pra atualizar o token de acesso. A galera implementa o token de acesso usando JWT já para não criar estado na API, mas da forma q ela implementou o refresh token, salvado ele no BD, a api n se torna stateful?
@@matheusalencar6708 existem dois tipos de api: a que vai ser usado em um site pro usuário fazer login e usar o site, e a api que você usa em serviços como a api do telegram por exemplo. No segundo caso você não precisa de salvar refresh token porque o token que você vai usar é uma chave de api, esse sim é restful. No primeiro caso não tem necessidade de ser restful porque você precisa necessariamente controlar se aquele usuário invalidou o token que ele gerou quando fez login, isso é necessário por motivos de segurança pra evitar que alguém pegue o jwt que você tem salvo no navegador e use em outro
@@itxToledo entendi, mas eu to fld num contexto de uma API REST. O primeiro exemplo que você deu eh a forma tradicional que a maioria dos sites de antigamente faziam, geralmente utilizando session. Mas numa API restful session n combina pq cria estado, e do jeito que ela implementou o refresh token, ao meu ver, está sendo criado estado no servidor. Tendeu brother??
Nunca concordo com esse argunto mencionado em 34:10, onde sempre dizem pra vc não retornar a mensagem de erro "usuário já cadastrado" pra evitar, por exemplo, que um "hacker" tenha conhecimento se o email já existe no sistema ou não. Isso porque para verificar essa informação bastaria cadastrar um novo usuário com esse email e vc saberia se ele já está ou não cadastrado no sistema. Existem muitas outras técnicas pra tornar aplicação mais segura, mas essa idéia de não mencionar se a senha ou o email estão incorretos não torna a aplicação mais segura.
@@itxToledo Essa idéia é repassada em vários tutoriais e artigos na internet, mas não ajuda na questão de segurança uma vez que é possível obter essa informação de outra maneira, como no exemplo que citei. Google, Microsoft, Instagram, Facebook, Yahoo entre outras retornam o erro correto, informando o usuário se é o email ou a senha que está incorreto.
@@RodrigoAlmeida22 Recentemente eu vi um vídeo interessante de um cara cumprindo um desafio do Try Hack Me, onde, por conta desse padrão do WordPress que é informar se apenas a senha está errada pra determinado usuário, o cara conseguiu acesso como root no servidor. Concordo com o seu ponto de que ao cadastrar um novo usuário a aplicação informa se aquele usuário existe, e também, muito provavelmente, o usuário é um campo público na aplicação, no entanto, qualquer medida de segurança é válida. A segurança da aplicação não é dada através de um único método, mas sim de um conjunto de medidas protetivas. No passado eu era pensava da mesma forma que você, queria trazer mais comodidade ao usuário descrevendo melhor o erro, porém existem pessoas mal intencionadas, então um método de segurança a mais sempre é bem vindo
@@ryanfmatos Realmente toda medida de segurança adicional é válida. Porém da forma como foi implementada no tutorial não agrega nenhuma. Para alguém mal intencionado um simples script poderia verificar facilmente a existência do usuário na rota de cadastro e depois tentar encontrar apenas a senha. Existem vários outros métodos que podem ser aplicados para proteger essa rota e as demais, inclusive a rota de cadastro como por exemplo, reCaptcha, um limitador de requisições baseado em IPs e/ou em outros parâmetros, duplo fator de autenticação e entre vários outros métodos. Acredito que é sempre importante também levarmos em consideração a experiência do usuário, pra não acabar ficando como muitas aplicações existentes no mercado onde o usuário quase não consegue acessar sua própria conta devido as verificações, e depois eventualmente vemos os dados dessas mesmas aplicações vazados na internet.
Olha, espero que Diego não leia meu comentário, não quero plantar a sementinha da discórdia mas já plantando 😂 os vídeos da Dani estão superando os do Diego 😇
Faltou colocar o código em um repositório para consulta posterior. Conteúdo ótimo, mas ter que ficar vendo o vídeo a cada vez que se precisa de um conteúdo específico é um pouco ruim.
E se o usuário trocar a senha e deixar salvo em algum browser ou app seu token, digamos que ele tenha sido roubado, essa estratégia de refresh token o antigo token continuaria sendo válido para acesso correto? Teria alguma solução pra prevenir essa possibilidade? Vídeo perfeito apenas essa dúvida de segurança fiquei
pensa assim, o access token tem uma expiração de uns 60 segundos, antes de enviar a requisição, vc verifica a expiração dele e se for o caso, chama a requisição do refresh token, aí vc tem um novo access token e segue a rotina. A questão é ter um mecanismo para revogar o refresh token que está salvo no banco, sem esse mecanismo, você sempre teria como renovar o access token, mesmo que vc mude seu usuário e senha, isso não interfere nos tokens. A não ser que na troca da senha, a rotina revogue, ou seja, apaga do banco, todos os refresh token desse usuário. Por isso gosto de adicionar uma camada de MFA no login, isso dificulta um pouco. Mas nada é perfeito ou 100% garantido.
3 года назад
muito legal, mas acho que ficou muito longo e a parte de refresh token depende de aplicação para aplicação. E pra que criou tantos arquivos? poderia fazer isso com funcões?
Está muito confuso os vídeos da Dani, pq ela coloca muitos conceitos da programação, por exemplo, padrões de projeto… pra quem não entende fica boiando, e essa parte menos importa para o conteúdo do vídeo. Meu conselho é, vá direto ao ponto, e faça toda a preparação de ambiente de forma simples, assim tanto um dev iniciante quanto um expert vai entender. Por exemplo, só pra vc preparar o ambiente pra mostrar o refresh demorou 52 minutos, fazendo de forma simples levaria bem menos, ou ate poderia deixar o ambiente já pronto.
quem precisa apenas do refresh token pode pular para 52:37 mas caso esteja aprendendo node e interessante ver o video inteiro pois mostra todo processo de criar uma autenticação
💜
nem todo herói usa capa
cara no video ela usou uma variavel com um certo nome e depois se arrependeu. 23:45 dai ela selecionou tdas simultaneamente e alterou. Como faz isso??? Eu sempre altero uma a uma na mao kkkkkkkkkkkkkk
@@weslleymatheus3643 seleciona a variavel, e vai apertando CTRL + D pra selecionar as outras
@@mathe1996 vlw muito, ajudou bastante vissi. Pior que eu faço essas coisas manualmente kkkk tiver mais dica, passa ai.
A ideia da aula é implementar Refresh Token, mas deu muita volta e explicou muita coisa desde criar uma api do zero, pra quem está começando é ótimo, mas pra quem só quer ver sobre a ideia principal demora muito, era bom ao menos colocar a linha do tempo pra quem quiser pular só pro conteúdo principal poder pular.
É os tópicos do vídeo na descrição séria muito melhor e acessível.
@@nan-code coloquei no 2x e fiquei pulando pra acha a parte do refresh
Faaaaala, Daniel!
Valeu demais pelo feedback e pelas sugestões! Vou passar pro time! 💜 😉
@@rocketseat Eu achei o video mais do que excelente, do jeito mesmo em que está. Parabéns!
Quebrou meu galho mais uma vez. Danielle Leão se garante demais. Meu Ignite fiz com ela.
Que aula maravilhosa, assisti todinha. Já que a Dani saiu, alguém da Rocketseat poderia refazer esse mesmo vídeo de refresh token mas usando NestJs, Postgresql e prisma. 😊
ela saiu da rocketseat?
@@matheusaraujo8617 Saiu, mas ela tem um canal próprio muito bom também!
Lembrando que autorizar um refresh_token já expirado pode trazer uma brecha na segurança, o ideal é gerar um novo refresh_token sempre que o atual for utilizado e se o atual estiver expirado retornar um erro de refresh_token expirado.
e se o refresh token expirar faz oq? manda fazer login de novo?
@@fernandoalcantar4 exatamente, se o refresh token é válido, gera um novo token e um novo refresh token, se não for mais válido retorna erro 403 unauthenticated e sucesso.
@@MuriloHenriqueA por exemplo o refresh token venceu apos 3 minutos ai automaticamente ja muda pra um atualiza um novo token de acesso e um novo refresh token? e fica nessa rotaçao de token infinitamente? isso nao sobrecarrega o sistema nao com novas solicitaçoes todo minutos?
@@fernandoalcantar4 eu faria isso....
@carlos.chea interessante seu jeito de pensa no último comentário aqui, mas se o cara que tiver acesso ao banco souber qual o modelo de criptografia, ele vai poder descriptografar
Dani é maravilhosa, me ajudou muito diversas vezes ... Sucesso linda...
A Dani é fera demais, né, Patrick? 💜
Parabéns! rocketseat é super necessária para a comunidade dev BR
Faaaaala, Jhonatan!
Que feedback maravilhoso de se ler! Valeu demais pelo carinho! 💜
Boooora pra cima com a gente! 🚀
Galera a rocket, o conteúdo de vocês são muitos bons, só uma ideia, seria da hora vocês (no caso de vídeos como esse, que usa conceitos) colocar uma espécie de diagrama, não sei se é essa a pegada do code/drops mas certamente ficaria mt bom pra ensinar sobre refresh token, já que ele é um conceito, i.e. vai além do código.
Ótimo vídeo! Mais uma vez a Rocket junto à seus instrutores, inovando com tópicos diferenciados. Parabéns Dani...
Valeu demais pelo feedback, Anselmo! Que massa que curtiu! 💜 🚀
not know , but just know you've affected my life, and apparently tens of thousands of others, in an imnsely positive way. Thank you
Fiquei apenas com uma dúvida: qual o sentido do access token ter um tempo de expiração, se ele sempre será automaticamente atualizado pelo refresh token? Se um usuário malicioso conseguir roubar nosso token, imagino que o tempo de expiração serviria justamente para impedir a utilização discriminada do mesmo. Porém, se o usuário possuir o token e se passar pelo alvo de quem o roubou, o refresh token não enviaria um novo access token assim que o anterior expirasse? O atacante não teria, então, acesso constante às informações de seu alvo?
Recomendo esse vídeo pra explicar o assunto - ruclips.net/video/t5iumvSNbgM/видео.html
Isso não aconteceria pois para criar um novo access token e necessário antes validar o refresh token, ou seja uma pessoa que tem apenas acesso ao nosso access token não conseguiria criar um novo acesso token já que pra isso também é necessário ter o refresh token
Bem legal o vídeo, pena que não veio antes de eu implementar em um projeto que estou trabalhando kkkk
eu não concordo muito com a parte de guardar os refresh token no banco de dados, eu acho que isso meio que tira o sentido do JWT mas é muito melhor na hora de invalidar as sessões do usuário
parabéns pelo ótimo contéudo
Guarda no banco o Refresh token tambem nao gostei.
Desculpe se a pergunta é básica, mas a forma que a API foi organizada, como por exemplo usando os Casos de Uso (pasta "useCases") se refere algum padrão específico de arquitetura? Achei bem interessante.
Acho que é algo de arquitetura limpa
O Use Cases poderia ser organizado como services?
Aí sim, tava precisando disso hj msm, vlw demais!!
Que massa, Renan! 💜 🚀
Sensacional! Queria ter me ligado nisso antes de ter feito uma dúzia de apis aqui...
Que massa que curtiu, Edu! Ahh! Importante é que agora você sabe! 💜 🚀
Toppp demais Dani eu tava precisando dms aprender a fazer isso no back e vc veio bem na hora com uma solução, obrigadissimo
Que show, Leandro! Bem no time então! Conseguiu resolver seu problema? 💜 🚀
Mr. Dr. Prof. Patrick appreciate it man
Nao precisa renomear cada arquivo, no vscode é só você apertar f2 com o que você quer alterar selecionado que ele já altera em todos os lugares que utilizada aquilo
Woow!
Valeu demais por compartilhar essa dica com a gente! 😉 💜
amo sua forma de ensinar
Ela manda bem demais, né? 💜 🚀
Salvar os refresh tokens no banco de dados dessa forma não seria uma falha de segurança, visto que um funcionário com acesso ou uma database leak faria com quem fosse possível acessar essas contas com o refresh token válidos no banco? Qual seria a solução? O Redis resolveria esse problema? E os refresh tokens expirados, só seriam apagados quando algum endpoint de autenticação fosse chamado?
impressionante como a rocketseat tem a capacidade de ler mentes
Wooow! Boa! HAHAHAHA
Te ajudamos, Gabriel!? 👀 💜
Não é...
Eu penso a mesma coisa, sempre que eu preciso de alguma coisa, aparece aqui
Existe algum motivo para não usar JWT também para o refresh token?
Façam um vídeo mostrando como implementar o jwt com o refreshtoken no frontend com React de forma segura, seria muiiiiiiiito top!!!
Faaaaaala, dev! Opa, sugestão anotada aqui! 💜 🚀
@@rocketseat Quando terá?
Esse Refresh Token, eu posso armazenar ele no meu localStorage?? Sei que tem riscos de XSS attack, dai estou na duvida de aonde posso armazenar ele. Parabéns pela aula!!! Ótima didática.
cookie
Salve Dani, qual é a vesão desse dayjs? o meu não apanha a função isAfter
Ai Dani top video, to direto mexendo com JWT e refresh mas ainda me bato em como interceptar no front quando o JWT expira, já fiz com o interceptor nas requisições mas achei muito ruim dessa maneira, seria daora um video sobre como interceptar no front a sessão invalida
Para saber se um token está expirado é só comparar : "jwt.exp < Date.now().valueOf() / 1000", se for menor você vai saber que expirou.
Ah, tem que usar a biblioteca "jwt_decode" para decodificar um jwt para ai sim poder fazer essa comparação.
Faaaaala, José!
Opa, excelente ponto! Anotei sua sugestão aqui! 💜 😉
Seria ótimo um video com mais detalhes do Prisma. Configurar ambientes de homologação e produção, estrutura de pastas e etc...
Ótimo vídeo, só uma duvida, qual é essa versão do Insomnia??
Bom demais.
Gratidão pelo conteudo.
Excelente aula, parabéns!
Só não vi onde está o código ? link ?
Muito bom!Mas aí ao efetuar login, o refreshToken é tbm retornado e fica armazenado no localStorage? 🤔
Dani, você pode colocar a configuração (JSON), do seu VS Code? Vejo que sempre que você inicia um projeto, o seu lint já funciona normalmente, mesmo sem nenhuma configuração adicional no projeto.
Fiquei na dúvida no fluxo. Digamos que tem essa rota /courses. Eu devo passar refresh_token como middleware dessa rota ou ele tem que chamar a rota refresh_token junto com a courses?
Colocando a função ensuredAuthenticated como middleware, a unica coisa que você precisa fazer na requisição é colocar no header authentication da sua chamda HTTP o bearer token
Sensacional 🚀
Existe algum repositório onde posso encontrar este código?
Gostaria de fazer uma pedido para a teacher Dani Leão, poderia fazer um vídeo mostrando paginação com express e typeORM?
Muito Obrigado. 🙏
Faaaala, Fernando! Anotei sua sugestão aqui, viu? Valeu demais! 💜 🚀
Valeu Dani!!!! muito bom!
Que massa que curtiu, Felipe! 💜 🚀
Acabei de terminar a trilha de node da Nlw6 e encontro esse vídeo!
E o que achou? 👀 💜
@@rocketseat muito bom né, como sempre!
Irado o vídeo! Cadê o link do repo?
Parabéns! Excelente conteúdo!
Que massa que curtiu, Andrelino! 💜 😍
Pra resolver esse problema do node é bom usar um nodemon, bom de mais regarrega sempre que algo no codigo muda
Para dar um update no usuario, você criar um novo arquivo UserUpdateUseCase ? com controller e tudo ou utiliza esse mesmo ?
Ficou um pouco confuso no final haha. Mas foi.
Tenho uma dúvida:
Em que exemplo de cenário o usuário teria vários refresh-tokens salvos? Utilizando dessa forma de guardar eles num banco, não teria muitos dados sem uso?
Em minha experiência sim, para auditoria e uso interno, como tracking é interessante, mas pra aplicação não faz muito sentido. Aí pra resolver isso eu recomendo usar dynamodb com time to live ou um redis. Qualquer banco de dados com expiração do registro já acho uma boa. Muito boa a pergunta por sinal.
Does it support for windows 10?
Mesmo não entendo nada (iniciante ainda) e de front end por cima kkkkk mas tô aqui só pra dar o like mermo ksjsjdjd
Valeu demais pelo carinho, Romulo! 😍 💜
Queria saber qual o plug-in que ela usa pra cálcular o tamanho dos imports.
Ja saiu o video sobre Prisma ?
👏👏👏👏
Muito bom!
very good tutorial . very clean . i am happy you didn't start digging deep into any specific feature - sotNice tutorialng that happens to too many
O problema que eu vejo utilizando o token na minha aplicação é que, se por um acaso alguém tiver acesso ao token e ao refresh token de outro usuário, essa pessoa mal intencionada tem da mesma forma acesso irrestrito à conta da vítima.
Dependendo da forma que o refresh token for gerado, e sua data de expiração, pode acarretar em problemas gravíssimos.
Comecei recentemente a me preocupar bastante com a questão de segurança num projeto que estou desenvolvendo, e como foi falado num PR que envolveu serviços de segurança, creio que a melhor forma de deixar a aplicação realmente segura é com 2FA ou com verificação por IP, pensando na ideia de trabalhar com jwt
teve o github?
Show d+!!!
Faaaaaala, dev! Valeu demais! 😍 💜
and build tracks from there and leave the rest for a later session. I did both but did the first way initially and it took a day to get through
usando um refresh token como este, você só poderia ter uma sessão ativa, certo? Caso um usuário tenha mais de um dispositivo, como ele pode permanecer conectado em ambos sem sair?
Muito obrigado, sou fã dos seus code drops!!! saudações da Argentina
O refresh token deve ser único por dispositivo. Da forma que ela implementou, você está correto, só há como manter logado um dispositivo, mas isso pode ser facilmente alterado permitindo salvar mais de 1 refresh token no banco. A forma que você iria fazer dependeria da rua regra de negócio, você pode só permitir vários refresh tokens, você pode limitar por um número fixo, pode limitar por dispositivos e, por exemplo, dar nome aos cliente, tipo "web" e "mobile" e apenas permitir esses 2 refresh tokens, você também pode associar com o ip, pode salvar outras informações do dispositivo e por aí vai.
Caso queira manter o mesmo refresh token para múltiplos dispositivos, você pode buscar no banco e retornar ao usuário nos outros dispositivos, caso já exista um. Acredito que não seria uma boa prática, talvez alguém possa acrescentar.
@@weslleygomes1799 O que eu acho que dá também é criar uma tabela no banco de dados para armazenar todos os refreshTokens associado aos userIds
No refresh token, além do id do usuário, ou nem isso, vc salva o id do registro do banco...então cada login é único e tem seu id refresh token próprio, além que dessa forma, vc tem salvar o dispositivo que acessou,
O Prisma é sensacional!!!
😍
Curte, Gustavo!? 💜
Uma aula sobre o prisma seria DEVeras interessante!
Gostei desse seu 'commitário'... 👀 🤣
Anotada sua sugestão! Pessoal pede demais por aqui mesmo! 💜 😛
Por hora, deixo esse vídeo que o Diego comenta um pouco sobre:
*Prisma 2: Automatize o acesso ao banco de dados | Code/Drops #29*
ruclips.net/video/2iS3SHwft0k/видео.html
💜 🚀
@@rocketseat 💜💜
Dani gostei muito da explicação mas não pude deixar de notar que esse refresh token é muito inseguro, qualquer pessoa que solicite uma requisição com apenas com o refresh token consegue se autenticar, a solução para isso seria capturar o ip do user. Vlw!
È que você só tem acesso ao refresh token se fizer o primeiro login com usuário e senha. É claro que entre o tempo do login e da expiração, que deve ser curta, se alguem invadir seu browser e pegar o refresh token, ele pode ficar dando refresh e utilizando o seu login
@@superv1773 exato, por isso o sistema precisa ter a opção de revogar todos os acessos, que seria apenas apagar esses refresh tokens do banco
Esse código fonte está disponível no github?
Com o prisma não há mais a necessidade de se criar uma camada de repositórios iguais as que criamos com o typeorm?
Isso é uma questão de projeto, ela fez assim para facilitar as coisas, mas uma camada de reposítório é sempre uma boa escolha, já que as demais camadas não devem saber como está sendo feito o acesso ao banco, apenas chama os métodos e pronto. Repositório é apenas um padrão de projeto, que vc pode ou não seguir.
Vim pelo Patrick, da caravana de Criciúma.
É realmente necessário salvar o refresh token no banco de dados?
Sim, vc pode deixar no redis também, o importante é ter um mecanismo para saber se o refresh token é válido, ou seja, se alguém roubar seu token e seu refresh token, você precisa ter como revogar o refresh token, aí não consegue mais renovar o token, a não ser que o cara pegou seu usuário e senha, aí não tem jeito.
It's been a wild ride.
Muito bom!!
Que bom que curtiu, Murilo! 💜
Qual o nome desse tipo de arquitetura?
Tem o código pronto - tipo github?!
Cara eu vi o tutorial inteiro menos os ultimos 3 minutos. E tava dando a merda do erro de chave unica na tabela, fui descobrir dps de umas 3hrs
Tudo bom Dani? mudei um pouco, criei um middlewares onde verifico se esta vencido e atualizo setando no header, porem localmente funcionou normal setando, meu problema foi quando coloquei em um container em nuvem, parou de setar, eu acredito que seja tempo de resposta. já tentou fazer setando no header o token novo?
Opa amigo, tudo bem? era essa implementação que to buscando e até agora não consegui, poderia me explicar como você fez?
Comunidade de devs linda. Me tirem uma dúvida antiga. Se a idéia de fazer o token ter vida curta é pra aumentar a segurança no caso de um roubo de sessāo por exemplo. O refresh token nāo sofre do mesmo risco? Alguém nāo pode roubar o meu refresh token e recuperar um token meu. Alguém tem material explicando pq mesmo assim o refresh é o mais recomendado?
acho que tu deverias era estudar sobre JWT antes de vir perguntar besteira.
Também fico imaginando a msm coisa, se o refresh vazar vai dar ruim do mesmo jeito
Isso é quase a mesma coisa que manter uma sessão no banco de dados, ainda prefiro manter os dados da sessão do que me preocupar em administrar isso(expiração/refresh, etc...), se salvasse de ler algo no banco de dados aí sim valeria a pena. O lance da sessão é q você pode por um id no token e de tempos em tempos, ou por qualquer critério que você achar melhor(troca de ip?), fazer a checagem no banco de dados, pode até comparar o userAgent pra dar um reforço, e quando o usuário deslogar vc apaga o id no banco e inválida o token, por conta do id dele não existir no banco de sessões.
@@naoseioquecriar olha, eu já estudei. E pode sim ser besteira, mas as respostas mais generosas são muito mais úteis q essa tua cuspida de palavras vazia.
@@lucas_badico já estudou? eu acredito que não; para vir com pergunta idiota é porque deve copiado/colado alguma coisa de um site e na hora de PROGRAMAR SÉRIO deve ter ficado perdido. Sobre a "cuspida de palavras vazias" ohhhh vou chorar aqui, com licença ahahahahahahah
Como armazeno de forma segura o 'refresh-token' no 'front-end', tanto para mobile ou web?
Alguém pode indicar uma boa solução ou apontar algum vídeo que trate do assunto?
localstorage ou cookies, sobre mobile não sei, mas existe várias abordagens
Armazenar o refresh token no BD não viola a restrição stateless do REST? Acho que deixa a API stateful, oq vcs acham?
Depende do que se trata, se for uma aqui onde uma máquina vai utilizar não se deve usar o refresh token e sim uma chave de api. Como aqui é sobre autenticação você deve salvar o refresh token no db pra poder ter a função de deslogar o usuário
@@itxToledo mas refresh token n eh usado para autenticação, e sim pra atualizar o token de acesso. A galera implementa o token de acesso usando JWT já para não criar estado na API, mas da forma q ela implementou o refresh token, salvado ele no BD, a api n se torna stateful?
@@matheusalencar6708 existem dois tipos de api: a que vai ser usado em um site pro usuário fazer login e usar o site, e a api que você usa em serviços como a api do telegram por exemplo. No segundo caso você não precisa de salvar refresh token porque o token que você vai usar é uma chave de api, esse sim é restful. No primeiro caso não tem necessidade de ser restful porque você precisa necessariamente controlar se aquele usuário invalidou o token que ele gerou quando fez login, isso é necessário por motivos de segurança pra evitar que alguém pegue o jwt que você tem salvo no navegador e use em outro
@@itxToledo entendi, mas eu to fld num contexto de uma API REST. O primeiro exemplo que você deu eh a forma tradicional que a maioria dos sites de antigamente faziam, geralmente utilizando session. Mas numa API restful session n combina pq cria estado, e do jeito que ela implementou o refresh token, ao meu ver, está sendo criado estado no servidor. Tendeu brother??
@@matheusalencar6708 mas tem que ser desse jeito, se não você diminui a segurança permitindo que alguém salve o jwt do seu navegador e use em outro
E se fosse com SOLID?
Ótimo conteúdo, não vi o código no github
Faaaaala, Arthur!
Vou pedir pra ela subir o código pra vocês! 😉 💜
@@rocketseat Já está disponível ?
Nunca concordo com esse argunto mencionado em 34:10, onde sempre dizem pra vc não retornar a mensagem de erro "usuário já cadastrado" pra evitar, por exemplo, que um "hacker" tenha conhecimento se o email já existe no sistema ou não. Isso porque para verificar essa informação bastaria cadastrar um novo usuário com esse email e vc saberia se ele já está ou não cadastrado no sistema.
Existem muitas outras técnicas pra tornar aplicação mais segura, mas essa idéia de não mencionar se a senha ou o email estão incorretos não torna a aplicação mais segura.
A ideia do login é você não informar precisamente o erro, nenhuma empresa faz isso
@@itxToledo Essa idéia é repassada em vários tutoriais e artigos na internet, mas não ajuda na questão de segurança uma vez que é possível obter essa informação de outra maneira, como no exemplo que citei.
Google, Microsoft, Instagram, Facebook, Yahoo entre outras retornam o erro correto, informando o usuário se é o email ou a senha que está incorreto.
@@RodrigoAlmeida22 Recentemente eu vi um vídeo interessante de um cara cumprindo um desafio do Try Hack Me, onde, por conta desse padrão do WordPress que é informar se apenas a senha está errada pra determinado usuário, o cara conseguiu acesso como root no servidor.
Concordo com o seu ponto de que ao cadastrar um novo usuário a aplicação informa se aquele usuário existe, e também, muito provavelmente, o usuário é um campo público na aplicação, no entanto, qualquer medida de segurança é válida. A segurança da aplicação não é dada através de um único método, mas sim de um conjunto de medidas protetivas.
No passado eu era pensava da mesma forma que você, queria trazer mais comodidade ao usuário descrevendo melhor o erro, porém existem pessoas mal intencionadas, então um método de segurança a mais sempre é bem vindo
@@ryanfmatos Realmente toda medida de segurança adicional é válida. Porém da forma como foi implementada no tutorial não agrega nenhuma.
Para alguém mal intencionado um simples script poderia verificar facilmente a existência do usuário na rota de cadastro e depois tentar encontrar apenas a senha.
Existem vários outros métodos que podem ser aplicados para proteger essa rota e as demais, inclusive a rota de cadastro como por exemplo, reCaptcha, um limitador de requisições baseado em IPs e/ou em outros parâmetros, duplo fator de autenticação e entre vários outros métodos.
Acredito que é sempre importante também levarmos em consideração a experiência do usuário, pra não acabar ficando como muitas aplicações existentes no mercado onde o usuário quase não consegue acessar sua própria conta devido as verificações, e depois eventualmente vemos os dados dessas mesmas aplicações vazados na internet.
Nome do aplicativo pra fazer os requests é: insomnia
Postman eu acho melhor
Por gentiliza alguém sabe o nome da música de fundo tocada a partir dos 13:01?
Olha, espero que Diego não leia meu comentário, não quero plantar a sementinha da discórdia mas já plantando 😂 os vídeos da Dani estão superando os do Diego 😇
Faltou colocar o código em um repositório para consulta posterior. Conteúdo ótimo, mas ter que ficar vendo o vídeo a cada vez que se precisa de um conteúdo específico é um pouco ruim.
criação = criation / criar = create | segundo o Google Translate
Gente, como que ela criou o bd?
Quem cria o bd é o prisma, quando ela roda a migration
Poderia fazer um exemplo com o oauth/ auth0
Sugestão anotadíssima, Iuri! 💜
Thought I was the only one "General S hettings...for the S het"
E se o usuário trocar a senha e deixar salvo em algum browser ou app seu token, digamos que ele tenha sido roubado, essa estratégia de refresh token o antigo token continuaria sendo válido para acesso correto? Teria alguma solução pra prevenir essa possibilidade? Vídeo perfeito apenas essa dúvida de segurança fiquei
As dúvidas mais complexas sobre essas "falhas"não são respondidas =(
Eu acho que não seria válido, já que o access token verifica se a informação do usuário está correta ...
pensa assim, o access token tem uma expiração de uns 60 segundos, antes de enviar a requisição, vc verifica a expiração dele e se for o caso, chama a requisição do refresh token, aí vc tem um novo access token e segue a rotina. A questão é ter um mecanismo para revogar o refresh token que está salvo no banco, sem esse mecanismo, você sempre teria como renovar o access token, mesmo que vc mude seu usuário e senha, isso não interfere nos tokens. A não ser que na troca da senha, a rotina revogue, ou seja, apaga do banco, todos os refresh token desse usuário. Por isso gosto de adicionar uma camada de MFA no login, isso dificulta um pouco. Mas nada é perfeito ou 100% garantido.
muito legal, mas acho que ficou muito longo e a parte de refresh token depende de aplicação para aplicação. E pra que criou tantos arquivos? poderia fazer isso com funcões?
Primeiro!!
Boooa, Roberto! 😍
I tNice tutorialnk tNice tutorials is my tNice tutorialng now
lets make soft
Absolute Zero
Está muito confuso os vídeos da Dani, pq ela coloca muitos conceitos da programação, por exemplo, padrões de projeto… pra quem não entende fica boiando, e essa parte menos importa para o conteúdo do vídeo. Meu conselho é, vá direto ao ponto, e faça toda a preparação de ambiente de forma simples, assim tanto um dev iniciante quanto um expert vai entender. Por exemplo, só pra vc preparar o ambiente pra mostrar o refresh demorou 52 minutos, fazendo de forma simples levaria bem menos, ou ate poderia deixar o ambiente já pronto.
top