Sensacional! Tem muitos conteúdos bons no youtube, mas o problema é que muitos deles estão ensinando com bibliotecas antigas que já tiveram diversas features do spring security deprecadas e isso é um grande problema pra quem está aprendendo com versões atualizadas. Como você usou o Spring 6, fica muito mais fácil agora! Obrigado pela ótima aula, continue assim!
Muito bom o vídeo, me ajudou a entender melhor, não estava compreendendo a documentação. Sabe se esse mecanismo/biblioteca de OAuth2 do Spring já implementa refresh tokens? Para gerar novos access tokens ?
Tem suporte sim, inclusive falei sobre isso nesse vídeo: Guia COMPLETO de Segurança para SPA com React, Java e Spring ua-cam.com/video/OTl2hyeEVv0/v-deo.html
Giuliana, finalmente concluí aqui a camada de segurança no meu projeto. Funcionou tudo! 🤙🤙 A única coisa que ficou meio rushado no final foi essa questão do password com BCrypt. Eu vi que você já inseriu direto no banco o password encryptado, mas seria legal ensinar como usar o BCrypt pelo código pra criptografar após colocar a senha na criação do usuário. Você tem uma aula explicando sobre isso? Se não, podia fazer uma continuação dessa aula explicando melhor isso.
Cara, eu estou com o mesmo problema KKKKKK ela colou um texto criptografado do que seria o primeiro usuário do sistema já que não se tem acesso a demais rotas para criar usuários, mas não nos disse onde conseguimos criptografar esta primeira senha que será descriptografado pelo spring.
@@LucasSouza-hg2tu eu achei um tutorial na net, mas nao é vídeo e tá em inglês. Pesquisa "how to generate bcrypt password in java" no google e pega o resultado do link 'dzone'. Lá tem um código que mostra bem simples como usar a lib
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
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!!
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) :)
Ótimo vídeo!! Faz uma implementação de refresh token e logout também. Tenho visto várias implementações, mas de versões mais antigas. Estou criando uma mega gambiarra no meu código pra tentar criar essas funções haha
Depois da Requisição de Autenticacao, quando pego o token, onde guardo esse token para enviar nas outras requisições? Uso o cabecalho da requisição para enviar o token? Obrigado
O token JWT é enviado no header da requisição, você pode usar um interceptor para adicionar o token em cada request. Tenho um vídeo que mostra esse fluxo complexo com um SPA, BFF e Backend, dá uma olhada que vai ficar mais claro: ua-cam.com/video/OTl2hyeEVv0/v-deo.html
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?
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.
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.
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!
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.
ja esta adptado para o spring 3.4.0? , mudei do 3.1.0 para 3.4.0 e deu problema justamente a parte de AuthorizationServer mas não fiz esse do video ainda , estou perguntando antecipadamente.
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!
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
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.
Ó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?
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.
Qual a diferença do OAuth implicit flow para essa implementação passando usuario e senha? Não é basicamente a mesma coisa? No seu video sobre OAuth você comentou que não é seguro que front end tenha acesso as secrets ou tokens, nessa implementação não estamos indo contra isso?
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!
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?
Excelente aula, Giuliana!! 👏👏👏 Eu fiquei com uma dúvida, nesse cenário podemos ter vários usuários cadastrados na aplicação, certo? Uma vez que o usuário se autenticou ele recebe seu token para acessar os recursos privados, nesse token contém o e-mail do usuário. Quando um recurso privado é acessado como podemos saber qual usuário fez o acesso? (Como pegar o e-mail a partir do token?)
Boa noite Giuliana, tudo bem? Primeiro quero te dar os parabéns, pois seus conteúdos são extraordinários. Só que nesse video fiquei com uma dúvida, pois não consegui fazer login enviando Json no corpo da requisição, com o email e senha, dessa forma que foi desenvolvido, não funciona passando os dados no RequestBody?
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 UA-cam 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 😅
Oi Giuliana, primeiramente, muito obrigado pela Aula! Eu fiquei meio perdido, nao sei se a playlist esta em ordem correta. Mas como vc testou via linha de comando? que User:Password eh esse que vc implementou? Na hora do cadastro na criacao do usuario, como faz a codificacao da senha quando manda para o banco de dados? Eu fazia a moda antiga com todos os detalhes expiracoes etc..
Giuliana, obg.... Tentei executar seu código, mas o authentication não es´ta sendo autointejado.... Eu tavai mplementando em groovy peloi seu modelo.. passei a tarde toda tentando arrumar kkkk, aí fui testar o seu, deu a mesma coisa... estranho, no video funcionou.. Tem alguma ideia? Faço um request post para logar (usuário cadastrado) A questão´e que o authentication fica null.. aí da erro na hora de pegar as authorities..
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
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
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.
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
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.
Cannot invoke "org.springframework.security.core.Authentication.getAuthorities()" because "authentication" is null, aparece esse erro quando tento autenticar pelo insomnia, clonei o seu projeto e não alterei nada. :(
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.
Não conhecia seu canal, cheguei aqui pelo spring security e agradeço por compartilhar seu conhecimento! Ganhou mais um inscrito com certeza!
😇Valeu! Estava travado tentando implementar uma autenticação JWT com Spring e esse vídeo me ajudou muito a destravar e continuar estudando.
Que bom que ajudou! Obrigada e sucesso 🙏🤗
Sensacional!
Tem muitos conteúdos bons no youtube, mas o problema é que muitos deles estão ensinando com bibliotecas antigas que já tiveram diversas features do spring security deprecadas e isso é um grande problema pra quem está aprendendo com versões atualizadas. Como você usou o Spring 6, fica muito mais fácil agora!
Obrigado pela ótima aula, continue assim!
É que nem na vida real, tem que se adaptar com as novas versões 😉
obrigado por facilitar meu trabalho! posso tirar o dia de folga agora...
Sensacional, muito obrigado pelo conhecimento compartilhado.
conteúdo de altíssima qualidade e muuuiito bem explicado!
Obrigadão Giu aula maravilhosa, mesmo em um conteúdo tão denso como o spring Security.
Se com o Spring é desse jeito! Imagina se não tivesse kkk. Ótima a sua aula!
Muito bom o vídeo, me ajudou a entender melhor, não estava compreendendo a documentação. Sabe se esse mecanismo/biblioteca de OAuth2 do Spring já implementa refresh tokens? Para gerar novos access tokens ?
Tem suporte sim, inclusive falei sobre isso nesse vídeo: Guia COMPLETO de Segurança para SPA com React, Java e Spring
ua-cam.com/video/OTl2hyeEVv0/v-deo.html
Explicação e didática excelente. Muito obrigado!!!
Parabens, conteúdo excelente!
Tô na torcida por um vídeo com token opaco também. Amei o vídeo. Muito obrigado ♥
Salva demais esses vídeos atualizados
Muito bom Professora !
Excelente, Giuliana! Muito obrigado por compartilhar :)
Giuliana, finalmente concluí aqui a camada de segurança no meu projeto. Funcionou tudo! 🤙🤙
A única coisa que ficou meio rushado no final foi essa questão do password com BCrypt. Eu vi que você já inseriu direto no banco o password encryptado, mas seria legal ensinar como usar o BCrypt pelo código pra criptografar após colocar a senha na criação do usuário. Você tem uma aula explicando sobre isso? Se não, podia fazer uma continuação dessa aula explicando melhor isso.
Cara, eu estou com o mesmo problema KKKKKK ela colou um texto criptografado do que seria o primeiro usuário do sistema já que não se tem acesso a demais rotas para criar usuários, mas não nos disse onde conseguimos criptografar esta primeira senha que será descriptografado pelo spring.
@@LucasSouza-hg2tu eu achei um tutorial na net, mas nao é vídeo e tá em inglês.
Pesquisa "how to generate bcrypt password in java" no google e pega o resultado do link 'dzone'.
Lá tem um código que mostra bem simples como usar a lib
@@LucasSouza-hg2tu Você pode colocar no main mesmo, cria um metodo simples para isso.
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
Excelente conteúdo. Parabéns!
simplesmente giuliana bezerra! era exatamente o q eu precisava. parabéns pelo conteúdo
Que ótimo! Sucesso o/
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!!
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) :)
Anotado aqui, obrigada pela sugestão! 🙏
esse space 2 ai me incomdou demais ... mas valeu pelo conteudo ... top demais.
Ótimo vídeo!! Faz uma implementação de refresh token e logout também. Tenho visto várias implementações, mas de versões mais antigas. Estou criando uma mega gambiarra no meu código pra tentar criar essas funções haha
Excelente!
Depois da Requisição de Autenticacao, quando pego o token, onde guardo esse token para enviar nas outras requisições? Uso o cabecalho da requisição para enviar o token? Obrigado
O token JWT é enviado no header da requisição, você pode usar um interceptor para adicionar o token em cada request. Tenho um vídeo que mostra esse fluxo complexo com um SPA, BFF e Backend, dá uma olhada que vai ficar mais claro: ua-cam.com/video/OTl2hyeEVv0/v-deo.html
Apenas elogios. Aula excelente como de praxe. Parabéns Giuliana!
Fantástico! Tem algum vídeo mostando as extensões que vc utiliza nesse projeto?
Juliana faz um completo usando todos os padrões e camadas corretamente e buscando as credenciais no banco postgres
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?
Você pode criar duas filtre chains separadas no SecurityConfig, e aí teria a possibilidade de em uma usar o jwt e na outra o basic auth
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"?
Tenho a mesma dúvida já procurei vídeos sobre o assunto e não encontro nada
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)
Você é ninja!!!!!!!! 👋👋👋👋👋
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 conteúdo. Acho interessante quando vai criar um sistema com springboot a partir de um sistema legado que já tem o banco consolidado.
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.
tentei fazer conectando com o banco do postgrelsql e nao consigo passar do 401, nao tenho mais ideia dq fazer
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!
Nesse caso seria através de múltiplos registros de client oauth, vou trazer um vídeo a respeito em breve
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.
Obrigado pelo video
Muito top tô tentando ver pela 3 vez para tentar entender
ja esta adptado para o spring 3.4.0? , mudei do 3.1.0 para 3.4.0 e deu problema justamente a parte de AuthorizationServer mas não fiz esse do video ainda , estou perguntando antecipadamente.
Na injeção de dependências do Repository, faz alguma diferença fazer com a annotation @Autowired?
Pode usar ambas as formas, maaaas, o pessoal do spring recomenda fazer injeção via construtor
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!
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
Tem um aulão spring security onde falo exatamente desse cenário, depois dá uma olhada 😉
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.
Show de bola, top demais! Só ficou uma dúvida, teria algum material de como fica usando client_secret_jwt invés de private_key_jwt?
Ó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?
Tbm tenho essa mesma dúvida 😅
Queria isolar o basic para o login
Basta criar duas filter chain e separar a lógica do jwt e http basic
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.
Como vc fez para gerar as chaves privada e publica usadas para gerar e ler o token?
Você pode gerar usando OpenSSL (pesquise: generate public and private key openssl)
Se estiver usando Windows rode os comandos dentro do Git Bash
@@JoaoLucas-mg9mv Valeu Joao, eu estava travado nisso e agora consegui!
Qual a diferença do OAuth implicit flow para essa implementação passando usuario e senha? Não é basicamente a mesma coisa?
No seu video sobre OAuth você comentou que não é seguro que front end tenha acesso as secrets ou tokens, nessa implementação não estamos indo contra isso?
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!
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?
Como fica a questão das chaves quando for fazer um deploy? Elas são passadas por variáveis de ambiente ? Qual a melhor forma?
Excelente aula, Giuliana!! 👏👏👏
Eu fiquei com uma dúvida, nesse cenário podemos ter vários usuários cadastrados na aplicação, certo? Uma vez que o usuário se autenticou ele recebe seu token para acessar os recursos privados, nesse token contém o e-mail do usuário. Quando um recurso privado é acessado como podemos saber qual usuário fez o acesso? (Como pegar o e-mail a partir do token?)
Uma dúvida, alguém sabe pq ela fez injeção das dependências
via construtor ao invés de usar @AutoWired?
Boa noite Giuliana, tudo bem? Primeiro quero te dar os parabéns, pois seus conteúdos são extraordinários. Só que nesse video fiquei com uma dúvida, pois não consegui fazer login enviando Json no corpo da requisição, com o email e senha, dessa forma que foi desenvolvido, não funciona passando os dados no RequestBody?
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 UA-cam 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 😅
Oi Giuliana, primeiramente, muito obrigado pela Aula! Eu fiquei meio perdido, nao sei se a playlist esta em ordem correta. Mas como vc testou via linha de comando? que User:Password eh esse que vc implementou?
Na hora do cadastro na criacao do usuario, como faz a codificacao da senha quando manda para o banco de dados?
Eu fazia a moda antiga com todos os detalhes expiracoes etc..
Não consegui importar esse JwtEncoder por nada... to usando a mesma versão do vídeo. Não sei o que ocorre
conseguiu solução colega? to com o mesmo b.o
Giuliana, obg.... Tentei executar seu código, mas o authentication não es´ta sendo autointejado.... Eu tavai mplementando em groovy peloi seu modelo.. passei a tarde toda tentando arrumar kkkk, aí fui testar o seu, deu a mesma coisa... estranho, no video funcionou.. Tem alguma ideia? Faço um request post para logar (usuário cadastrado) A questão´e que o authentication fica null.. aí da erro na hora de pegar as authorities..
Acho que tinha que limpar as dependencias... executei após o clean o seu projeto e deu certo.. e o meu tbm...
fantástico Juliana. Como faço para cadastrar as claims?
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
Não sei se o problema é só comigo mas o CORS não ta desabilitando de maneira nenhuma. Alguém mais teve esse problema ?
Estou tendo Problemas na Autenticação pra combinar com Swagger o Servlet está conflitando com o Swagger
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
Olá Giu! estou tentando ler os campos do JWT após ele ser validado... consegue me dar um help onde seria?
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?
O código tá no github sim, dá uma olhada: github.com/giuliana-bezerra/spring-security-jwt
tive o mesmo erro, como vc resolveu?
@@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.
excelente conteúdo. Porém travei nessa parte para gerer as chaves pública e privado. como gerar?
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
@@carlosalexandresilva3697 tem q baixar o openssl e colocar como variavel de ambiente tbm
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.
Como ficaria um cadastro pra gerar a senha encriptografada?
Você pretende fazer um vídeo complementar sobre RefreshToken? Fiz o seu curso de Testes na Udemy, muito bom !
Eduardo, eu já fiz, é o último vídeo da playlist de segurança, da uma olhada
Como implementar o refresh token baseado nessa implementação?
Cannot invoke "org.springframework.security.core.Authentication.getAuthorities()" because "authentication" is null, aparece esse erro quando tento autenticar pelo insomnia, clonei o seu projeto e não alterei nada. :(
vi que vc usou vscode, na empresa que vc trabalha eles não exigem uma IDE especifica? não gosto de nenhuma a não ser o vscode
Ótimo vídeo, poderia passar o código para resolver o problema de CORS ?
Dá uma olhada minha playlist da arquitetura ao deploy, nela mostro um código que habilita o cors para o frontend desenvolvido
Na parte das chaves, não é o contário? Se codificado com o chave pública e decodificado com a chave privada?
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 Sei. Acho que embaralhei um pouco. mas me lembro sim do conceito de criptografia assiétrica.
@@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.
E para o usuário se cadastrar, tem algum outro vídeo que tem isso?
Top...Top!👏
Será que poderia implementar os papeis de usuários e o refresh token nesse projeto
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.
@@giulianabezerra vlw
Professora. Que tal um authentication oauth2, mas com 39minutinhos.. rapidinho e simplificado.. fica aqui a sugestão
Como chama esse programa que você fez o Design
Toooooooooooop
Giulia, qual o site/software que usas para fazer esses diagrama?
Eu uso o Whimsical nesse vídeo, mas também uso o FreeForm e o Notas do Mac
The master
"Nossa, funcionou" hahhaha
valeu, mas pq vc faz a injeção de dependência manualmente?
Boa pergunta... @Autowired
ótimo conteudo, Faz um com cognito? Não vejo muito contudo em portugues para o uso
Anotei aqui, obg!
Gostei. Você tem uma npub no nostr pra eu te mandar alguns sats?
Nem conhecia, eu não tenho nenhuma rede social, apenas LinkedIn 😅
Fiz todo o passo a passo e no fim não autenticou, estou frustrado não consigo implementar o spring security nem que a vaca tuça
Olha, essa matéria aí deu um pouco de medo kkkkkk. Deve ser por essas coisas que pagam bem um programador = )
Segurança é talvez um dos tópicos mais avançados de programação, tem que ter paciência mesmo e ir estudando aos poucos cada conceito
Vídeo excelente, mas ainda é muita coisa né 🤔
Namoral spring security é ctrl c ctrl v kkkk