Muito obrigado pelo conteúdo enriquecedor Giuliana estou a alguns dias tentando entender como faz isso no spring security, após vê esse vídeo me deu bastante clareza e acredito que vou conseguir implementar
Parabens pelo trabalho e pela excelente didática. Giuliana, você teria algum exemplo de projeto que implemente a renovação do token jwt seguindo essa mesma linha de implementação? Muito grato!
Muito bom Giuliana! simplesmente perfeita a sua abordagem começando primeiro com a motivação, pra quem fica meio em dúvida do que estudar. Já vou seguir a playlist e procurar saber mais sobre! Gostaria de deixar como sugestão se aprofundar um pouco mais nessa questão de testes automatizados, unitários e integração. Já vi os vídeos do canal, mas seria muito massa um vídeo com exemplos práticos do que cada teste deve realizar (sempre fico perdido) :)
Trabalho a um tempo com C# .NET, e me interessei a pouco tempo em estudar um pouco de Java. Essa parte de autenticação com JWT achei até meio complexa, em relação a implementação que o .NET tem, mas achei bastante interessante. Da a impressão de ter muito mais controle sobre a validação e a geração do Token, embora seja mais verbosa. Parabéns pela aula excelente!!
GIu, seu conteúdo é extreamamente bom! Obrigado pelas aulas. Ja assisti a aula de oauth também e é nota 10! Gostaria de saber como disponibilizar tanto a atutenticação do google quanto essa via aplicação proprietária, seria um baita conteúdo!
Parabéns Giuliana por mais esse excelente conteúdo! Tenho uma dúvida: Em uma arquitetura de microsserviços a parte de autenticação tem que estar no Gateway ou em um "user service"?
Existe um pattern chamado access token e no desenho dele o gateway fica responsável pela autenticação , dessa forma o userservice seria apenas responsável pelas operações de usuário (crud)
Muito bom o vídeo, achei a implementação muito simples... Porém passei horas tentando encontrar/aprender a forma correta de gerar o par de chaves necessários. Em alguns lugares eu encontrava tutorias para gerar as chaves porém quando eu tentava utilizar elas, o código dava algum erro no enconding na hora de ler a private key. No final eu encontrei esses comandos aqui para gerar as chaves via CMD usando OPENSSL: openssl genrsa -out keypair.pem 2048 openssl rsa -in keypair.pem -pubout -out public.pem openssl pkcs8 -in keypair.pem -topk8 -nocrypt -inform PEM -outform PEM -out private.pem Obs: O OPENSSL deve ser instalado separadamente, basta buscar pelo instalador internet. No site da fabricante você vai achar uma versão para fazer o build na sua máquina, mas também dá para achar versões para Windows que é só executar o instalador.
Excelente video. Seria possível retornar a exceção em caso de erro de usuário ou senha inválidos? Ou por exemplo token expirado? Acho que faltou esse detalhe importante, visto que só é retornado 401 nesses casos.
Como as credenciais pertencem ao idp, depende dele retornar uma mensagem no corpo da resposta. Os códigos são genéricos e de fato não dizem muita coisa, precisaria observar o corpo da resposta para entender o que aconteceu.
Muito obrigado, este vídeo foi extremamente útil. Só não é perfeito por, na minha humilde opinião, por ter uma classe a mais, pois não parece fazer muito sentido: UserAuthenticated. Parece-me fazer mais sentido a própria classe User implementar o interface UserDetails. De todas as formas, agradeço-te imenso pois entendi muito melhor como implementar com uma versão mais recente do Spring Boot, no meu caso 3.2.4, com Spring Security e JWT. A maioria dos tutoriais que anda por aí de facto está muito desactualizada e este foi sem dúvida o melhor. Subscrito!
Exatamente! Pq pra projetos mais novos normalmente a gente usa um IDP corporativo pra prover a identidade, e nesse cenário acaba sendo usada a config com Oauth mesmo, como mostro no aulão de Spring Security aqui do canal.
Poderia ter a parte 2 desse video, aonde poderia passar o grant type, client_id e client_secret para autenticação, juntamente com login e senha. Muitos bacanas seus vídeos, com otima didáctica
Bom dia Giuliana, tudo bem? Muito obrigado por mais um conteúdo excelente! Não sei se aqui é o lugar certo para eu te fazer essas perguntas. Se não for já peço desculpas antecipadas 🤦♂ Vou começar a fazer seu curso de testes com Spring Boot na Udemy. Será que vira um cupom de desconto? 😅 Outra pergunta, você tem no seu radar vídeos sobre Docker e Kubernetes? Sabe um tipo de conteúdo que sinto falta na Internet? Principalmente em português? Uma arquitetura de micro serviços utilizando os projetos Spring Cloud deployados no Kubernetes. Sabe, como fazer, boas práticas, etc. Tenho certeza que seria um diferencial muito bacana do seu canal. Muito obrigado e mais uma vez agradeço por compartilhar conosco conteúdos de muita qualidade!😉
Tenho muitos planos, só tá difícil por em prática pq preciso conciliar meu trabalho com RU-vid e outras atividades. Quem sabe um dia quando der pra viver com minhas atividades de ensino eu consiga colocar em prática todos os planos, por enquanto tá devagarzinho mesmo , mas vai sair 😅
Excelente vídeo, parabens! Fiquei apenas com uma dúvida. A rotas protegidas podem ser acessadas por basic auth (sem o jwt, apenas com credenciais ou com o jwt). Como faço para restringir o basic auth somente a rota de login?
Excelente aula! Eu tenho uma duvida em como eu poderia implementar Roles nos usuários. Eu criei um arquivo com os enums de roles, porém quando eu adiciono como um atributo na entity User eu não consigo fazer autenticação porque a rota /authenticate e todas as outras me retornam Unauthorized mesmo deixando como permitAll. Como eu poderia implementar?
Aulão top Giuliana, parabéns! Eu gostaria de saber uma coisa, você lê de uma forma especifica a documentação para poder captar informações de forma mais assertiva? tem um jeito que você faz que prefere ou qualquer coisa assim? Volto a repetir, conteúdo de extrema qualidade, obrigado!
Sim, eu tenho um método que funciona bem pra mim. Costumo ver algum tutorial prático ou artigo e depois vou pra doc apenas pra aprofundar algo que precise, eu sinto mais resultado dessa forma
Uma duvida na criação do SecurityFilterChain tendo em vista que eu tenho um token de duração longa exemplo 2 dias preciso atribuir o httpBasic no builder ? tendo em vista que posso ter um token longo ? outra duvida na hora do par de chaves nos não vamos subir isso pro git provavelmente. ou colocamos direto no maquina de prod os arquivos ? podemos usar os valores dessas chaves como uma variavel de ambiente
Dois dias de token? Não recomendo, mas vc consegue configurar a duração no idp ou no gateway, se estiver usando um (tem vídeo sobre o access token pattern aqui no canal). Sobre as chaves, pode utilizar como variável de ambiente ou utilizar algum tipo de encriptação para não colocar os arquivos em texto puro no git.
Parabéns Giuliana pela aula, consegue transmitir o conteúdo de forma bastante simplificada sem perder a profundidade teórica, gostei muito do vídeo! Tenho uma dúvida quanto a viabilidade desta solução em outro contexto. Quero disponiblizar para o usuário final os dois métodos de autenticação, o primeiro neste formato (login/senha com JWT), o segundo através de social login (oauth2). A forma mais correta seria utilizar cada método separadamente e criar endpoints específicos, ou existe alguma forma mais adequada para fornecer esta solução (2 tipos de login na aplicação)?
Isso, vc teria duas formas diferentes de login, serviços diferentes, e aí no front teria um link pra redirecionar pra cada opção. Eu costumo ver mais a opção com oauth mesmo, usando um idp dentro do próprio auth server, é mais desacoplada e permite trocar facilmente os componentes caso necessário.
@@giulianabezerra, olá, tudo bem? É possível elaborar um vídeo onde integra as duas soluções? Queria ver como este código ficaria na classe de configuração e no resources com os end-points
Mano, te dar uma luz, se vc tem o git instalado na tua maquina, abre o git bash, pode ir num diretorio teu, pelo explorador de arquivos mesmo, com botao direito do mouse (sem estar com o cursor em cima de uma pasta), em "mais opcoes" aparece o git bash vc vai rodar dois comandos, a geracao das chaves é feita pelo próprio git PRIMEIRO VC GERA A CHAVE PRIVADA openssl genrsa -out private_key.pem 2048 AGORA VC EXTRAI A CHAVE PÚBLICA DA CHAVE PRIVADA openssl rsa -in private_key.pem -pubout -out public_key.pem entao vc vai ter dois arquivos diferentes com formato .pem depois é fazer os passos do vídeo
Muito boa a iniciativa!!! Mas seguindo seus passos encontro um erro: java.lang.IllegalArgumentException: Could not resolve placeholder 'jwt.public.key' in value "${jwt.public.key}", apesar de estarem definidos conforme o vídeo. Faltou alguma configuração a ser mostrada no vídeo? Esse código está no seu git hub?
@@vitor__________ aos 26:30 ela comenta, você tem que criar os dois arquivos de chave publica e privada(use algum gerador de chaves) e colocar o caminho deles na properties.
Em aplicações que utilizam uma arquitetura de microserviços, como seria o desacoplamento da camada de segurança (criação de usuário e geração de token) para um microserviço separado e, posteriormente, a validação dos papéis (roles) apropriados em outros microserviços? Sei que existem alternativas como o Keycloak, que poderiam desempenhar essa função, mas em um projeto em estágio inicial, talvez não seja prático estabelecer uma infraestrutura tão robusta.
A parte de segurança a gente costuma usar o acess token pattern, falei disso num vídeo aqui do canal. O gateway centralizaria essa responsabilidade de se comunicar com o auth server e devolver o jwt. Em relação aos papéis seria nas aplicações mesmo pois se trata de regra de negócio, não é legal colocar muita inteligência nos barramentos da solução. Essa parte é tranquilo fazer com o spring security. O id token pode inclusive ser enviado como cabeçalho pelo gateway e assim passar os papéis que o usuário logado possui para que seja feita a validação do acesso.
muito bom, excelente didatica. como eu faco pra ter uma autenticacao que pode ser feita via banco ou via ferramenta de terceiros como o google ou facebook?
Sobre a autenticação de terceiros tem vídeo na playlist de spring security, aulão spring security. Sobre usar banco, ainda não fiz vídeo mas vou adicionar a sugestão aqui na lista.
Ótima aula, só tenho algumas duvidas por exemplo voce adicionou o httpBasic como custom default isso faz com que qualquer endpoint possa se autenticar usando o usuario e senha não apenas o login, por causa disso se você remover esse parte requestMatchers("/authenticate").permitAll() o endpoint ira funcionar normalmente pois o httpBasic ira executar antes como estará passando o user:pass pelo header estara autenticando e gerando o token Estou procurando uma solução somente para basic no endpoint de login e jwt nas demais, como poderia bloquear o basic nos outro endpoints?
Não, na criptografia assimétrica o token é codificado com a chave privada (ela assina o token) e decodificado com a pública (ela verifica o token). Se fosse possível codificar com a chave pública, ela não poderia ser pública pq aí seria possível adulterar tokens e assiná-los novamente.
@@giulianabezerra Já entendi minha confusão. a ordem é ao contrário quando você quer criptografar a informação. Fazer uma ponte segura. Mas no caso estamos assinando as chave, não embaralhando ela. Esse era um uso que eu não conhecia da criptografia assimétrica.
Professora, existem várias formas de trabalhar com segurança em nossas aplicações, vc mesmo tem trazido várias, em vídeos bem explicados. E necessário conhecer todas, ou seria melhor tentar focar em uma de forma bem aprofundada? Qual seu conselho?
Eu sugiro aprofundar no uso do Oauth, pois costuma ser a alternativa mais usada corporativamente. A figura do auth server + id provider traz mais modularidade pra solução, é simples substituir caso desejado um componente por outro, além do mais esses caras costumam ser robustos e nos poupam retrabalho.