Muchísimas gracias Crack!!! Logré la implementación de JSON Web Token en mi proyecto. Ahora bien, me encontré con algunas variaciones, debido a que algunas de los métodos han cambiado, como por ejemplo en la creación del token cambiaron los parametros de .signWith(SignatureAlgorithm.HS256, ACCESS_TOKEN_SECRET.getBytes()) y para ésto es necesario incluir una dependencia adicional al proyecto: javax.xml.bind. Es un hecho que en la medida que se utilicen librerías más actualizadas, serán mayores los cambios, pero la base está allí.
Que pro, la verdad no entendí nada de lo que se hizo, pero funciona y lo necesito para sacar un proyecto rápido. Ya con mas tiempo aprendo bien este tema de spring security por que se ve interesante.
Sos lo mejor que hay, todos los videos que hay estaban super desactualizados y se complicaban con un monton de cosas, son el primero al que sigo, y hace que todo ande como corresponde, muchisimas gracias
No es que se compliquen, es que puede que integren otras funcionalidades que dependan de los requerimientos. Para un primer acercamiento este video es genial, pero te faltaran otras aristas si queres hacer algo funcional.
Buen tutorial, eso si falta el repositorio en Github para aclarar algunas dudas que surgen en el camino, pero al final de todo super util el video. Gracias
Excelente video. Logré comprender la lógica general que se hace para validar la API. En mi caso, vi la validación por JWT en Alura latam, pero en su momento no seguí el ritmo de cómo lo aplicaban. Hasta ahrora logro comprender de una mejor forma el código que se implementó allá!
He seguido el tutorial y me ha servido mucho. Tengo que interiorizar un poco algunos pasos, verlo con más calma, a ver si consigo entender profundamente como funciona, para cuando tenga que hacer modificaciones. Pero gran trabajo, me has puesto en el camino.
Excelente video crack ,ayuda mucho para aquellos que implementan por primera vez jwt en springboot como yo, en mi caso use la v3.0.9 y funciono sin problemas, entendiendo esta parte uno puedo modificarlo a gusto , en mi caso le añadi unas respuestas personalizadas y a mi gusto personal me gusta mas que retorne el token en el body, pero cambiando solo unas cuantas lineas se pude hacer sin problemas PD: Para aquellos que les da un error 403 aun con el token chequen bien en los dos filtros que el bearer tenga un espacio "Bearer " en mi caso ese fue un problema que tuve jejejeje.
Muy buen video, lo unico que modificaria por ahora es recibir el usuario y contrasena en un json, no como parametro porque se estarian exponiendo los datos.
Excelente video. Después de mucho indagar, gracias a vos pude implementar el JWT en mi proyecto. Lo último que me queda es saber cómo hacer una excepción para las solicitudes GET, ya que lo que tengo que lograr es que la información siempre esté disponible, pero cuando se inicie sesión, esta pueda modificarse. Muchas gracias.
Gracias ojala sigas haciendo contenido con este formato y estilo me interesa mucho spring y sus diferentes usos y me encanta que lo uses de forma actualizada, gracias.
GENIO, no tengo otras palabra. Necesitaba implementar JWT a un proyecto que estoy haciendo con JAVA con Spring y Gradle, y seguí tal cual los pasos (adaptando solamente un par de cosas) y todo salió 10 puntos. La verdad que muchas gracias!
Hola Guille, te consulto a vos que te salio todo ok ... cuando intento ingresar las credenciales a /login desde el postman, me sigue diciendo 401 unauthorized, esto como lo resolviste vos? osea, por lo que veo no hay que generar un controller de login, esto lo generaria solo spring. vos como lo encaraste? Gracias !!
@@AlanBenitez-pm8mo Como va Alan! Tengo un controller de login, pero lo acabo de probar sin controller y funciona igual.. Recordá mandarlo por body en raw mas o menos con este formato: { "userName": "user", "password": "123" }
@@GMaxVideo sisi es exactamente lo que hago, tengo experiencia levantando api rest y utilizando postman, pero soy nuevo en spring. tanto /login como /api/login me tiran unauthorized, realmente no entiendo por que
Exelente tutorial!, muchisimas gracias crak. Si al alguien le aparece un error así "io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 176 bits which is not secure enough for any JWT HMAC-SHA algorithm" Intenten usar un token mas largo en la variable "ACCES_TOKEN_SECRET", pueden usar este por ejemplo "8rjjf6ehq9rufj4h4ghg9geyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", y con eso se solucionaria. muchas gracias nuevamente crakc por este contenido tan valioso!
Amigo una pregunta veo que muchas personas en otros videos crean el UserDetails dentro la entidad que llaman por ejemplo usuario pero otros crean la entidad y crean otra clase llamada UserDetails para implementar los metodos pero tambien hay casos que solo sobreEscribren el UserDetails en la clase UserDetailsService, mi pregunta cual seria la forma mas ideal de hacer esto ?
Hola. te consulto. Como se debe implementar para hacer con un formulario. Armo uno pero me deniega el acceso. intentando logre que lanze 200, pero despues me aparece el mismo html y me lanza forbidden.
Eso podría ser a nivel de token con los claims desde la autenticación y luego la verificación en la autorización. Pero también podría ser con una consulta a base de datos en la autorización.
¿por qué en el minuto 35:20 , el filtro de "Authorization" se indica que debe ir antes del "Authentication"? ¿acaso primero no es la "Authentication" ?
falta el servicio web del login al que llamas. No enseñas como esta montado el servicio de "/login". Por favor comparte enlace al proyecto o repositorio. Gracias, seria de gran ayuda. saludos.
hola! los roles lo tendrías que cargar desde el servicio que carga el usuario desde la base de datos a partir del email/username. De ahí ya es cuestión de las reglas de protección usando el objeto http .✌
Buen tutorial actualizado, en los filtros he abierto unos endpoints y los leo con Angular sin problemas, el tema es el "login". Con postman anda bien, pero desde Angular salta error CORS que se supone es del backend. Probre configuracion global CORS en spring, probe poner el endpoint (login) en el filtro, y me sigue dando error CORS desde un servicio auth de Angular.
@@AlexMtzArt return httpSecurity // DESABILITAR EL CSRF .csrf().disable() // ACCEDER A LAS REGLAS DE LAS SOLICITUDES .authorizeHttpRequests() // CUAL QUIER SOLICIDUD .anyRequest() // DEBE ESTAR AUTENTICADA .authenticated() // Y .and() // QUITAMOS EL BLOQUEO DE CORS .cors() // Y .and() // ENTRAMOS A LA GESTIÓN DE LAS SESIONES .sessionManagement() // CREAMOS UNA POLITUCA DE CREACIÓN DE SESIÓN .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // Y .and() // AGREGAMOS EL FILTRO DE AUTENTICACIÓN .addFilter(jwtAuthenticationFilter) // AGREGAMOS EL FILTRO DE AUTORIZACIÓN .addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class) // CONSTRUIMOS EL SecurityFilterChain .build();
@@DJLFMIX return httpSecurity // DESABILITAR EL CSRF .csrf().disable() // ACCEDER A LAS REGLAS DE LAS SOLICITUDES .authorizeHttpRequests() // CUAL QUIER SOLICIDUD .anyRequest() // DEBE ESTAR AUTENTICADA .authenticated() // Y .and() // QUITAMOS EL BLOQUEO DE CORS .cors() // Y .and() // ENTRAMOS A LA GESTIÓN DE LAS SESIONES .sessionManagement() // CREAMOS UNA POLITUCA DE CREACIÓN DE SESIÓN .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // Y .and() // AGREGAMOS EL FILTRO DE AUTENTICACIÓN .addFilter(jwtAuthenticationFilter) // AGREGAMOS EL FILTRO DE AUTORIZACIÓN .addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class) // CONSTRUIMOS EL SecurityFilterChain .build();
No se por qué me da un error 403 y he hecho exactamente lo mismo que usted , paso a paso. No tiene disponible el código para poder comparar, se lo agradecería. Un saludo y excelente vídeo !!!
Quiere decir que por cada API que desarrolle debo de tener una configuración de spring security? Hay alguna manera de que puede integrar seguridad a un grupo de APIs? Gracias de antemano
Hola, muchas gracias por el video, ha sido de mucha ayuda para entender como es el proceso de autenticación y autorización en spring, sin embargo yo estoy tratando de implementarlo en un ambiente de microservicios y tengo un proyecto de gateway, uno de oauth y otros mas de los usuarios y sugerencias, además que quisiera ponerle roles donde un usuario pueda consultar pero otro usuario pueda editar, y bueno se me dificulta saber donde poner cada parte del proceso, porque he visto que en el proyecto de gateway de springcloud puedo poner una parte que solo reenvíe la solicitud al proyecto de oauth y en este realizar la autenticación y autorización y lo de los roles y finalmente ver el listado de usuarios, pero también he visto que en el proyecto de gateway se puede poner el filtro de los roles y me he hecho un poco bolas sobre donde debería ir cada parte, además no se como hacer lo de los roles, tienes algún otro video donde se revise lo de los roles? y alguno donde tengas microservicios con spring cloud gateway y seguridad como aquí? gracias!
Una pregunta yo tengo un proyecto con java 8 pero en la línea 44 cuando utilizas el .emptyList() podría utilizar otro método de java 8 he visto por internet utilizando el arrayToList pero si alguien me puede ayudar porque de java no piloto mucho sería de gran ayuda
Sinceramente parece esos videos donde el que lo hace siguió una guía sin comprender del todo lo que está haciendo o porque y por eso termina haciendo una infinidad de cosas innecesarias. Si simplemente vas a implementar una autenticación por usuario y contraseña con JWT no hace falta reimplementar los authenticators y todo eso, se pueden utilizar las implementaciones que ya están hechas dentro de Spring Security. Por otra parte, es francamente estúpido retornar el token en el header y con el prefijo al autenticarse, el método login, debería retornar, en el body, un objeto que represente el set mínimo de datos del usuario que se autenticó, como ser, su nombre, su avatar, sus roles habilitados, y por supuesto el token, luego con esto, en el front, puedes renderizar esto como lo hace, por ejemplo Google en sus aplicaciones donde enseña tu avatar en un círculo (generalmente arriba a la derecha). Otra cosa más, no tiene ningún sentido la redirección a /login de los servicios si la autenticación "falla", eso es algo de lo que debiera encargarse el frontend en función de los requerimientos, es decir, el frontend es quien debe invocar el servicio de autenticación para obtener un token y los datos del usuario para luego consumir el resto de servicios y en caso de que esté intentando consumir algún servicio con un token inválido o expirado, es el propio frontend quien debe redirigir al usuario a la pantalla de inicio de sesión. Incluso se podría utilizar una plataforma como KeyCloack para el manejo del inicio de sesión y hasta se podría utilizar doble factor.
Muchas gracias ¿Cómo puedo usar además el email el nombre de usuario, de ese mismo usuario para iniciar sesión? Es decir, quiero poder hacer "login" tanto con el usuario como con el email
Hola Keko. Puedes usar el mismo parámetro email o cambiarle de nombre y descifrar si tiene un @ en medio usar la autenticación por email, de lo contrario usar la autenticación por nombre de usuario.
Buen Tutorial bro, fue de mucha ayuda, pero tengo una duda ¿Cómo podrías especificar que solamente te permita solicitar información a una ruta sin tener un token? Estoy tratando de hacer pero no me permite utilizar antMatchers, mvcMatcher ni regexMatcher solamente requestMatchers
Hola crack! Excelente video, me sirvio de mucho y explicas excelente. Pero honestamente luego de hacer todo exactamente igual a como lo hiciste, cada solicitud GET que hago a /contacts me da como resultado 403 forbidden. Realmente ya probe todo hasta el momento y no se como lograr arreglarlo, cualquier sugerencia es bienvenida. Muchas gracias!
Me pasó lo mismo pero seguramente es porque en el método getAuthentication de la clase TokenUtils, en el claims estas utilizando .parseClaimsJwt(token) en lugar de .parseClaimsJws(token) cambia la "t" por la "s". Y ese es todo el problema si lo demás lo tienes idéntico. Suerte!!
Hola Darwin! te felicito por el excelente contenido de Todo TIC, de lejos este es el mejor video explicativo de JWT que hay en Youtoube. Quería preguntarte, respecto a la inyección de dependencias que haces en el minuto 33:38, hay alguna diferencia entre hacerlo inyectándolo por el constructor que haciéndolo con la anotación @Autowired?
hola Santiago, la inyección de dependencias por constructor es más recomendable que la inyección por campo (con @Autowired) principalmente por temas de testeabilidad, sin embargo ambos hacen lo mismo, resolver dependencias.
@@todoticcom Hola, cuando compilo me sale el error "Consider defining a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' in your configuration." alguna idea? tengo colocado bien los beans
@@edgardocozzo en mi caso yo solucione ese error por que me falto agregar la anotacion @Service en UserDetailsServiceImpl, lo que hace la anotacion es agregar el bean que busca el context de Spring
@@mauriciopizarro9503 Justo lo que comenta @rs_strange3 en realidad la inyección que se debe hacer es el UserDetailsServiceImpl que está en tu mismo paquete y no al UserDetailsService del core, y debes agregar el @Service, con eso
Hola ingeniero, excelente video, realice el proceso con una BD oracle y todo funciono a la perfección, solo una duda, me podrías indicar por favor que clases tocar para usar autenticación por LDAP, intente con un ejemplo que viene en la página de spring pero me sale un error de time out
Hola, te agradeceria muchisimo si compartis el repo con el codogo que funciona, me estoy poniendo loco porque no me devuelve el token pero no veo errores en el codigo o en el log. Ya vi el video 3 veces revisando que todo este en orden, GRACIAS!!
No me acaba de funcionar. Es decir, si que cuando accedo a la API y me solicita el pop up de login, lo pasa correctamente. Asi como cuando lo hago por Postman. No obstante cuando estoy en la api, me funcionan los endpoints, pero cualquiera de los introducidos post-login en Postman, me retorna un 401. Aún con el JWT puesto.
Excelente video muchas gracias me sirvió mucho, solo una duda, por que cuando paso las variables secret y expirationTime al archivo application.properties me regresa en null como existieran?? en otra app no me pasa eso, solo cuando implemento la seguridad, de antemano gracias por tu tiempo.
Hola, espero respondas al hacer la autenticacion del final con el postman me sigue apareciendo el error 401 aun con el token ¿Como puedo solucionarlo? uso el jdk 19 y el spring boot 3.0.
Hola un saludo!, me podrías dar un poco de luz de como permitir los CORS en conjunto con este método de seguridad??? cuando lo implementé en conjunto con mi front desde los servicios de aws no deja de sacarme el error de CORS
Hola Charly, la configuración de CORS debes realizarlo en la API que haz desarrollado. Este video puede servirte como guía th-cam.com/video/cqbteQM9T_c/w-d-xo.html
Muchas gracias por el video es bastante claro, lo seguí todo sin problemas, solo que al final cuando hago las pruebas con postman, puedo obtener el token, porque me da un Status 200, copio el token para poder probarlo en "Contactos", siempre desde postman, pero en vez de mostrarme los datos, solo me devuelve el Status 403, tienes idea porque podría ser el error, utilice spring 2.7 y jdk 17. Gracias de antemano si pudieras responder
@@luisangelreynagaricra3229 Hola, no pude resolverlo todavía ya revise el código desde el principio pero, siempre me tira el mismo error cuando tengo que utilizar el token generado, tu pudiste ver algo? Esperemos el profe nos pueda dar una manito 😀
Me pasó lo mismo pero seguramente es porque en el método getAuthentication de la clase TokenUtils, en el claims están utilizando .parseClaimsJwt(token) en lugar de .parseClaimsJws(token) cambia la "t" por la "s". Y ese es todo el problema si lo demás lo tienes idéntico. Suerte!!
Hola, muchas gracias, pude implementar el 100 % de tu video con oracle, solo me queda una duda que aun no he logrado resolver, como hago el login desde un controlador? para usarlo con swagger, ya logre que el JWT me ignore el swagger pero no logro llamar el login desde un controlador.... y por cierto excelente video.
En ese caso los filtros ya no serían usados, en su lugar estarías realizando la implementación de la autenticación manualmente desde tu controlador y estableciendo el usuario principal.
Muchas gracias ¿Cómo hago para que cada usuario solo pueda ver su dashboard, o tenga su instancia individual y solo tenga acceso a sus datos y/o pueda modificar solamente sus datos?
buenas, me esta dando un 403 forbidden luego de hacer el login y pegarle al endpoint. alguna idea de porque estaria fallando? el login funciona bien, porque lo probe con credenciales incorrectas y me dio error. y luego con contraseñas correctas y me funciona. lo unico que no me funciona es luego el endpoint.
bueno, mi error era bastante sencillo pero un poco dificil de verlo. en el webSecurityConfig habia puesto en los filtros dos veces el mismo, authenticationFilter en ambos. lo cambie y me quedo funcionando: .addFilter(jwtAuthenticationFilter) .addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
seria bueno dejar el repositorio del codigo , ya que cuando intento acceder a login siempre revisa lo del token y nunca me genera el token. no importando si el password o el email es correcto
Muy bueno, me sirvio mucho ya que la mayoria de videos que implementan Spring Security son los que utilizan la interfaz deprecated. Me gustaria hacer una critica constructiva, siento que el tiempo que te tomas para hablar diciendo lo que estas haciendo, que ya lo estamos viendo porque vemos el codigo, se podria utilizar para explicar de forma muy corta para que sirve cada cosa que haces. espero que se entienda. Gracias por el video!
Muchas gracias por el video, pregunta , estas envidando la password en el body para validar la auth en texto plano, no podría ser un fallo grave de seguridad? cualquiera podría capturar la llamada y saber nuestro username password y obtener el Bearer token verdad? Muchas gracias
Muy buen video , pero no puedo probar sin el endpoint de /login podria mostrarlo o como puedo probar el logueo ya que el token no se me genera y todos los endpoints me devuelven la respuesta 401 Unathorizate
Honestamente primer video de Spring Security + Jwt que entiendo. Muchísimas gracias! ❤
Muchísimas gracias Crack!!! Logré la implementación de JSON Web Token en mi proyecto. Ahora bien, me encontré con algunas variaciones, debido a que algunas de los métodos han cambiado, como por ejemplo en la creación del token cambiaron los parametros de .signWith(SignatureAlgorithm.HS256, ACCESS_TOKEN_SECRET.getBytes()) y para ésto es necesario incluir una dependencia adicional al proyecto: javax.xml.bind. Es un hecho que en la medida que se utilicen librerías más actualizadas, serán mayores los cambios, pero la base está allí.
Gracias hermano, me salvaste de un apuro, la verdad se te agradece mucho por la aportación
Que pro, la verdad no entendí nada de lo que se hizo, pero funciona y lo necesito para sacar un proyecto rápido. Ya con mas tiempo aprendo bien este tema de spring security por que se ve interesante.
Sos lo mejor que hay, todos los videos que hay estaban super desactualizados y se complicaban con un monton de cosas, son el primero al que sigo, y hace que todo ande como corresponde, muchisimas gracias
No es que se compliquen, es que puede que integren otras funcionalidades que dependan de los requerimientos. Para un primer acercamiento este video es genial, pero te faltaran otras aristas si queres hacer algo funcional.
@@elgriego6288 que me recomiendas para seguir viendo? Todo sirve
Buen tutorial, eso si falta el repositorio en Github para aclarar algunas dudas que surgen en el camino, pero al final de todo super util el video. Gracias
Excelente video. Logré comprender la lógica general que se hace para validar la API. En mi caso, vi la validación por JWT en Alura latam, pero en su momento no seguí el ritmo de cómo lo aplicaban. Hasta ahrora logro comprender de una mejor forma el código que se implementó allá!
Muchas gracias me ayudo mucho! Un sabado a las 1:00 am aprendiendo ! Jeje-
Excelente video amigo, seria chévere uno implementado lo de los roles, seria de gran ayuda, muchas gracias...
opino lo mismo @TodoTic
He seguido el tutorial y me ha servido mucho. Tengo que interiorizar un poco algunos pasos, verlo con más calma, a ver si consigo entender profundamente como funciona, para cuando tenga que hacer modificaciones. Pero gran trabajo, me has puesto en el camino.
Excelente video, detallado y funcional, gracias
Dios gracias por este video!!!!, ya me estaba desesperando para encontrar algo de java que no fuera para principiantes xd
Muy interesante su proecto! o mejor dicho PROYECTO! Gracias.
Muy ágil y detallado. Por otra parte, en mi opinión y por lo que veo, securizar una API tiene una complejidad excesiva, llega a ser absurda.
Lo mismo pienso, pero es seguridad, por algo ciberseguridad es una carrera
Excelente video crack ,ayuda mucho para aquellos que implementan por primera vez jwt en springboot como yo, en mi caso use la v3.0.9 y funciono sin problemas, entendiendo esta parte uno puedo modificarlo a gusto , en mi caso le añadi unas respuestas personalizadas y a mi gusto personal me gusta mas que retorne el token en el body, pero cambiando solo unas cuantas lineas se pude hacer sin problemas
PD: Para aquellos que les da un error 403 aun con el token chequen bien en los dos filtros que el bearer tenga un espacio "Bearer " en mi caso ese fue un problema que tuve jejejeje.
podrias mostrarme como hiciste para retornar el token en el body?
Hola KisameNarusas como hiciste para responder el token en el body, aprecio tu ayuda. Gracias
Muy bien explicado. Excelente material.
Excelente ! muy bueno y práctico ! sigue por éste camino.Saludos
Muy buen video, de verdad muchas gracias, me estaba volviendo loco jajaja Gracias
Excelente maestro muchas gracias, suscrito y esperando pronto comprar algun curso, muy buen material explicado
Muy buen video, lo unico que modificaria por ahora es recibir el usuario y contrasena en un json, no como parametro porque se estarian exponiendo los datos.
Excelente video. Después de mucho indagar, gracias a vos pude implementar el JWT en mi proyecto. Lo último que me queda es saber cómo hacer una excepción para las solicitudes GET, ya que lo que tengo que lograr es que la información siempre esté disponible, pero cuando se inicie sesión, esta pueda modificarse. Muchas gracias.
hola Máximo, solo es cuestión de configurar las reglas de acceso con el objeto http donde estableces los filtros. Salu2.
Gracias ojala sigas haciendo contenido con este formato y estilo me interesa mucho spring y sus diferentes usos y me encanta que lo uses de forma actualizada, gracias.
Muchas gracias amigo, me sirvió como guía para un proyecto
Excelente, muy buen contenido Gracias!!
Gracias excelente explicación maestro.
Muy buen contenido , me encanto!
Sigue asi!
GENIO, no tengo otras palabra.
Necesitaba implementar JWT a un proyecto que estoy haciendo con JAVA con Spring y Gradle, y seguí tal cual los pasos (adaptando solamente un par de cosas) y todo salió 10 puntos.
La verdad que muchas gracias!
Hola Guille, te consulto a vos que te salio todo ok ... cuando intento ingresar las credenciales a /login desde el postman, me sigue diciendo 401 unauthorized, esto como lo resolviste vos? osea, por lo que veo no hay que generar un controller de login, esto lo generaria solo spring. vos como lo encaraste? Gracias !!
@@AlanBenitez-pm8mo Como va Alan! Tengo un controller de login, pero lo acabo de probar sin controller y funciona igual..
Recordá mandarlo por body en raw mas o menos con este formato:
{
"userName": "user",
"password": "123"
}
@@GMaxVideo sisi es exactamente lo que hago, tengo experiencia levantando api rest y utilizando postman, pero soy nuevo en spring. tanto /login como /api/login me tiran unauthorized, realmente no entiendo por que
Hola para que te funcione el login en la configuración de la seguridad tienes que poner a /login que se excluya del security.
@@guillermoemm Si ! lo pude resolver, gracias broder
Excelente explicación, muchas Gracias
Excelente tutorial. muchas gracias
Muy bien explicado. Gracias!
Excelente video, muy bien explicado. 🫡🥳 gracias! 👏🏽👏🏽
Justo lo que estaba buscando Gracias :)
como habilito los cors par que mi frontend pueda autenticarse sin problemas?
02:02 No hay nada en la descripción del video
Podrias subir el codgio algun repositorio oalgo?
Excelente contenido 💪Gracias 🤝
Hola, una pregunta y como seria el Logout, o eso lo valida el frontend o como seria?
Exelente tutorial!, muchisimas gracias crak.
Si al alguien le aparece un error así "io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 176 bits which is not secure enough for any JWT HMAC-SHA algorithm"
Intenten usar un token mas largo en la variable "ACCES_TOKEN_SECRET", pueden usar este por ejemplo "8rjjf6ehq9rufj4h4ghg9geyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", y con eso se solucionaria.
muchas gracias nuevamente crakc por este contenido tan valioso!
Gracias por salvarme de pasar 3 horas intentando averiguar qué era, te amo desconocido
good work king, love you
Barbaro bro ! por casualidad podes subir el repo?
Hola amigo buenas noches, excelente presentacion, puedes por favor compartir el codigo el github o algun otro repositorio?
Está también adjunta la db (db.sql)
No parece que este publicado 🥲
@@FelipeGrungeable no hay ningún enlace a nada
@@XavierRomeroLopez me los borraron de aca por lo visto.
@@FelipeGrungeable compártelo porfa
Buen video comparte el repo amigo, muchas gracias.
seria bueno que pusieran las versiones de cada dependencia.
me suscribo buen video, saludos".
Excelente video 😁
Amigo una pregunta veo que muchas personas en otros videos crean el UserDetails dentro la entidad que llaman por ejemplo usuario pero otros crean la entidad y crean otra clase llamada UserDetails para implementar los metodos pero tambien hay casos que solo sobreEscribren el UserDetails en la clase UserDetailsService, mi pregunta cual seria la forma mas ideal de hacer esto ?
Excelente aporte
amigo, me ayudo un montón!!
hola buenas tardes con algunos errores para avanzar de tales como las implementaciones de getter y setter cuando iintento asociarlo en otra clase
Hola. te consulto. Como se debe implementar para hacer con un formulario. Armo uno pero me deniega el acceso. intentando logre que lanze 200, pero despues me aparece el mismo html y me lanza forbidden.
hola que tal, por qué deshabilitamos el csrf ( http.csrf().disable()... )?
Que jdk estás usando y que versión de springboot?
Me pasas las versiones amigo, Keys y BuilderParser no estan en las versiones que pasaste o estan en otra ruta de objeto
Maravilloso 👍👍
Buen contenido, como le agregarías la validación por roles?
Eso podría ser a nivel de token con los claims desde la autenticación y luego la verificación en la autorización. Pero también podría ser con una consulta a base de datos en la autorización.
Que version de jdk utilizas? Yo utilizo la version 11. Porque en el minuto 20:39 cuando intento escribir .orElseThrow me arroja un error.
Utiliza la version 17.
¿por qué en el minuto 35:20 , el filtro de "Authorization" se indica que debe ir antes del "Authentication"? ¿acaso primero no es la "Authentication" ?
Hola Rafael. El orden de la declaración de los filtros en esa construcción es irrelevante.
falta el servicio web del login al que llamas. No enseñas como esta montado el servicio de "/login". Por favor comparte enlace al proyecto o repositorio. Gracias, seria de gran ayuda. saludos.
Creo entender que no es necesario.
Pudiste solucionarlo?
@@andrest5939 directamente me vi otro video, ya que este sujeto que subió el vídeo subió cosas incompletas. Menudo chapuzas... En fin...
Uno como hace para excluir ciertos endpoints de la autenticacion si en este caso la autenticacion se rige en todos los endpoints?
return http
.csrf()
.disable()
.authorizeHttpRequests().antMatchers("/health").permitAll() ⬅
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(jwtAuthenticationFilter)
.addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
hola como estas, dejame felicitarte por tan ben video, es muy facil de entender. Como se realizaria la autenticacion con roles q estan en una tabla??
hola! los roles lo tendrías que cargar desde el servicio que carga el usuario desde la base de datos a partir del email/username. De ahí ya es cuestión de las reglas de protección usando el objeto http .✌
Creo que no encontre las dependencias en la descripcion..
Buen tutorial actualizado, en los filtros he abierto unos endpoints y los leo con Angular sin problemas, el tema es el "login". Con postman anda bien, pero desde Angular salta error CORS que se supone es del backend. Probre configuracion global CORS en spring, probe poner el endpoint (login) en el filtro, y me sigue dando error CORS desde un servicio auth de Angular.
hola Adrian, adicionalmente a la configuracion global CORS hay que llamar al metodo cors del objeto http.
pudiste resolverlo?
lo pudieron resolver?
@@AlexMtzArt
return httpSecurity
// DESABILITAR EL CSRF
.csrf().disable()
// ACCEDER A LAS REGLAS DE LAS SOLICITUDES
.authorizeHttpRequests()
// CUAL QUIER SOLICIDUD
.anyRequest()
// DEBE ESTAR AUTENTICADA
.authenticated()
// Y
.and()
// QUITAMOS EL BLOQUEO DE CORS
.cors()
// Y
.and()
// ENTRAMOS A LA GESTIÓN DE LAS SESIONES
.sessionManagement()
// CREAMOS UNA POLITUCA DE CREACIÓN DE SESIÓN
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
// Y
.and()
// AGREGAMOS EL FILTRO DE AUTENTICACIÓN
.addFilter(jwtAuthenticationFilter)
// AGREGAMOS EL FILTRO DE AUTORIZACIÓN
.addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
// CONSTRUIMOS EL SecurityFilterChain
.build();
@@DJLFMIX
return httpSecurity
// DESABILITAR EL CSRF
.csrf().disable()
// ACCEDER A LAS REGLAS DE LAS SOLICITUDES
.authorizeHttpRequests()
// CUAL QUIER SOLICIDUD
.anyRequest()
// DEBE ESTAR AUTENTICADA
.authenticated()
// Y
.and()
// QUITAMOS EL BLOQUEO DE CORS
.cors()
// Y
.and()
// ENTRAMOS A LA GESTIÓN DE LAS SESIONES
.sessionManagement()
// CREAMOS UNA POLITUCA DE CREACIÓN DE SESIÓN
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
// Y
.and()
// AGREGAMOS EL FILTRO DE AUTENTICACIÓN
.addFilter(jwtAuthenticationFilter)
// AGREGAMOS EL FILTRO DE AUTORIZACIÓN
.addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
// CONSTRUIMOS EL SecurityFilterChain
.build();
No se por qué me da un error 403 y he hecho exactamente lo mismo que usted , paso a paso. No tiene disponible el código para poder comparar, se lo agradecería. Un saludo y excelente vídeo !!!
Quiere decir que por cada API que desarrolle debo de tener una configuración de spring security? Hay alguna manera de que puede integrar seguridad a un grupo de APIs?
Gracias de antemano
Hola, muchas gracias por el video, ha sido de mucha ayuda para entender como es el proceso de autenticación y autorización en spring, sin embargo yo estoy tratando de implementarlo en un ambiente de microservicios y tengo un proyecto de gateway, uno de oauth y otros mas de los usuarios y sugerencias, además que quisiera ponerle roles donde un usuario pueda consultar pero otro usuario pueda editar, y bueno se me dificulta saber donde poner cada parte del proceso, porque he visto que en el proyecto de gateway de springcloud puedo poner una parte que solo reenvíe la solicitud al proyecto de oauth y en este realizar la autenticación y autorización y lo de los roles y finalmente ver el listado de usuarios, pero también he visto que en el proyecto de gateway se puede poner el filtro de los roles y me he hecho un poco bolas sobre donde debería ir cada parte, además no se como hacer lo de los roles, tienes algún otro video donde se revise lo de los roles? y alguno donde tengas microservicios con spring cloud gateway y seguridad como aquí? gracias!
hola! puedo generar el token pero no me deja usarlo para acceder a los endpoints alguno me daría una mano
Una pregunta yo tengo un proyecto con java 8 pero en la línea 44 cuando utilizas el .emptyList() podría utilizar otro método de java 8 he visto por internet utilizando el arrayToList pero si alguien me puede ayudar porque de java no piloto mucho sería de gran ayuda
Donde puedo generar secrets para el token?
Sinceramente parece esos videos donde el que lo hace siguió una guía sin comprender del todo lo que está haciendo o porque y por eso termina haciendo una infinidad de cosas innecesarias.
Si simplemente vas a implementar una autenticación por usuario y contraseña con JWT no hace falta reimplementar los authenticators y todo eso, se pueden utilizar las implementaciones que ya están hechas dentro de Spring Security.
Por otra parte, es francamente estúpido retornar el token en el header y con el prefijo al autenticarse, el método login, debería retornar, en el body, un objeto que represente el set mínimo de datos del usuario que se autenticó, como ser, su nombre, su avatar, sus roles habilitados, y por supuesto el token, luego con esto, en el front, puedes renderizar esto como lo hace, por ejemplo Google en sus aplicaciones donde enseña tu avatar en un círculo (generalmente arriba a la derecha).
Otra cosa más, no tiene ningún sentido la redirección a /login de los servicios si la autenticación "falla", eso es algo de lo que debiera encargarse el frontend en función de los requerimientos, es decir, el frontend es quien debe invocar el servicio de autenticación para obtener un token y los datos del usuario para luego consumir el resto de servicios y en caso de que esté intentando consumir algún servicio con un token inválido o expirado, es el propio frontend quien debe redirigir al usuario a la pantalla de inicio de sesión.
Incluso se podría utilizar una plataforma como KeyCloack para el manejo del inicio de sesión y hasta se podría utilizar doble factor.
Tenga su buen like hombre
Muchas gracias
¿Cómo puedo usar además el email el nombre de usuario, de ese mismo usuario para iniciar sesión?
Es decir, quiero poder hacer "login" tanto con el usuario como con el email
Hola Keko. Puedes usar el mismo parámetro email o cambiarle de nombre y descifrar si tiene un @ en medio usar la autenticación por email, de lo contrario usar la autenticación por nombre de usuario.
Buen Tutorial bro, fue de mucha ayuda, pero tengo una duda
¿Cómo podrías especificar que solamente te permita solicitar información a una ruta sin tener un token?
Estoy tratando de hacer pero no me permite utilizar antMatchers, mvcMatcher ni regexMatcher solamente requestMatchers
.authorizeHttpRequests()
.requestMatchers(
"/auth/**",
"/actuator/**",
).permitAll()
Creo que es a lo que te refieres
PAPU ¿PUEDES COMPARTIR EL REPOSITORIO DE GITHUB DE ESTE PROYECTO CON JWT PARA DESCARGARLO? SI NO SE PUEDE NO HAY PROBLEMA.
Y cual es el proyecto anterior a este?
Hola crack! Excelente video, me sirvio de mucho y explicas excelente. Pero honestamente luego de hacer todo exactamente igual a como lo hiciste, cada solicitud GET que hago a /contacts me da como resultado 403 forbidden. Realmente ya probe todo hasta el momento y no se como lograr arreglarlo, cualquier sugerencia es bienvenida. Muchas gracias!
Me pasó lo mismo pero seguramente es porque en el método getAuthentication de la clase TokenUtils, en el claims estas utilizando .parseClaimsJwt(token) en lugar de .parseClaimsJws(token) cambia la "t" por la "s". Y ese es todo el problema si lo demás lo tienes idéntico. Suerte!!
tengo este error: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
Hola Darwin! te felicito por el excelente contenido de Todo TIC, de lejos este es el mejor video explicativo de JWT que hay en Youtoube. Quería preguntarte, respecto a la inyección de dependencias que haces en el minuto 33:38, hay alguna diferencia entre hacerlo inyectándolo por el constructor que haciéndolo con la anotación @Autowired?
hola Santiago, la inyección de dependencias por constructor es más recomendable que la inyección por campo (con @Autowired) principalmente por temas de testeabilidad, sin embargo ambos hacen lo mismo, resolver dependencias.
@@todoticcom Hola, cuando compilo me sale el error "Consider defining a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' in your configuration."
alguna idea? tengo colocado bien los beans
@@mauriciopizarro9503 Hola Mauricio, me sale el mismo error lo pudiste solucionar?
@@edgardocozzo en mi caso yo solucione ese error por que me falto agregar la anotacion @Service en UserDetailsServiceImpl, lo que hace la anotacion es agregar el bean que busca el context de Spring
@@mauriciopizarro9503 Justo lo que comenta @rs_strange3 en realidad la inyección que se debe hacer es el UserDetailsServiceImpl que está en tu mismo paquete y no al UserDetailsService del core, y debes agregar el @Service, con eso
Hola ingeniero, excelente video, realice el proceso con una BD oracle y todo funciono a la perfección, solo una duda, me podrías indicar por favor que clases tocar para usar autenticación por LDAP, intente con un ejemplo que viene en la página de spring pero me sale un error de time out
Hola, te agradeceria muchisimo si compartis el repo con el codogo que funciona, me estoy poniendo loco porque no me devuelve el token pero no veo errores en el codigo o en el log. Ya vi el video 3 veces revisando que todo este en orden, GRACIAS!!
@@juanignaciomeza4378 me pasa igual, ¿lo solucionaste?
No me acaba de funcionar. Es decir, si que cuando accedo a la API y me solicita el pop up de login, lo pasa correctamente. Asi como cuando lo hago por Postman. No obstante cuando estoy en la api, me funcionan los endpoints, pero cualquiera de los introducidos post-login en Postman, me retorna un 401. Aún con el JWT puesto.
Lo pudiste solucionar?
Excelente video muchas gracias me sirvió mucho, solo una duda, por que cuando paso las variables secret y expirationTime al archivo application.properties me regresa en null como existieran?? en otra app no me pasa eso, solo cuando implemento la seguridad, de antemano gracias por tu tiempo.
si lo estás mapeando desde TokenUtils, esque esa clase no está siendo gestionado por spring así que la gestion de dependencias no va a funcionar.
Excelente estimado, cómo haria para retornar el token en el body?
hola Juan, tendrías que realizar un procedimiento similar para escribir en el response de la solicitud.
como seria con el tema de roles, cambiaria mucho?
Lo has encontrado?
Muy buen video, me ayudo muchísimo. Es necesario la implementación de algun tipo de logout? Y también, hay algún video implementando los roles?
No en este caso, ya que el token tiene una fecha de expiración fijada.
Hola, en el caso de sesiones como se haría? tienes video@@todoticcom
Hola! Alguien que haya conseguido hacer el inicio de sesión desde un form.html? No sé muy bien que necesita el controlador... Gracias!
Hola, espero respondas al hacer la autenticacion del final con el postman me sigue apareciendo el error 401 aun con el token ¿Como puedo solucionarlo? uso el jdk 19 y el spring boot 3.0.
pudiste? a mi me pasa lo mismo con la misma version
Hola un saludo!, me podrías dar un poco de luz de como permitir los CORS en conjunto con este método de seguridad??? cuando lo implementé en conjunto con mi front desde los servicios de aws no deja de sacarme el error de CORS
Hola Charly, la configuración de CORS debes realizarlo en la API que haz desarrollado. Este video puede servirte como guía th-cam.com/video/cqbteQM9T_c/w-d-xo.html
Muchas gracias por el video es bastante claro, lo seguí todo sin problemas, solo que al final cuando hago las pruebas con postman, puedo obtener el token, porque me da un Status 200, copio el token para poder probarlo en "Contactos", siempre desde postman, pero en vez de mostrarme los datos, solo me devuelve el Status 403, tienes idea porque podría ser el error, utilice spring 2.7 y jdk 17. Gracias de antemano si pudieras responder
tengo el mismo problema, lo lograste solucionar
@@luisangelreynagaricra3229 Hola, no pude resolverlo todavía ya revise el código desde el principio pero, siempre me tira el mismo error cuando tengo que utilizar el token generado, tu pudiste ver algo? Esperemos el profe nos pueda dar una manito 😀
Me pasó lo mismo pero seguramente es porque en el método getAuthentication de la clase TokenUtils, en el claims están utilizando .parseClaimsJwt(token) en lugar de .parseClaimsJws(token) cambia la "t" por la "s". Y ese es todo el problema si lo demás lo tienes idéntico. Suerte!!
Hola, no tenes el código en algún repo?
Hola, muchas gracias, pude implementar el 100 % de tu video con oracle, solo me queda una duda que aun no he logrado resolver, como hago el login desde un controlador? para usarlo con swagger, ya logre que el JWT me ignore el swagger pero no logro llamar el login desde un controlador.... y por cierto excelente video.
En ese caso los filtros ya no serían usados, en su lugar estarías realizando la implementación de la autenticación manualmente desde tu controlador y estableciendo el usuario principal.
Muchas gracias
¿Cómo hago para que cada usuario solo pueda ver su dashboard, o tenga su instancia individual y solo tenga acceso a sus datos y/o pueda modificar solamente sus datos?
Hola Keko. A través de las anotaciones como RolesAllowed, PreAuthorize, etc... También puede hacerse manualmente en el controlador o servicio.
Alguien tiene el link del código fuente? Tengo unos errores de que no detecta algunas clases y quisiera ver el pom original :/
buenas porque a dia de hoy cuando ingreso al 8080 me pide clave y usuario pero no ya no me funcionan?? , como hago para generar un nuevo token
uhmmm, los token tienen un tiempo de vida útil después expiran. Saludos.
buenas. Puedes pasar el enlace del proyecto? No veo link referenciado al proyecto. saludos.
comparte enlace del proyecto pls!!
buenas, me esta dando un 403 forbidden luego de hacer el login y pegarle al endpoint.
alguna idea de porque estaria fallando?
el login funciona bien, porque lo probe con credenciales incorrectas y me dio error.
y luego con contraseñas correctas y me funciona.
lo unico que no me funciona es luego el endpoint.
bueno, mi error era bastante sencillo pero un poco dificil de verlo.
en el webSecurityConfig habia puesto en los filtros dos veces el mismo, authenticationFilter en ambos.
lo cambie y me quedo funcionando:
.addFilter(jwtAuthenticationFilter)
.addFilterBefore(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
gracias , tendras el codigo fuente para confirmar dudas?
seria bueno dejar el repositorio del codigo , ya que cuando intento acceder a login siempre revisa lo del token y nunca me genera el token. no importando si el password o el email es correcto
Excelente!!
Muy bueno, me sirvio mucho ya que la mayoria de videos que implementan Spring Security son los que utilizan la interfaz deprecated. Me gustaria hacer una critica constructiva, siento que el tiempo que te tomas para hablar diciendo lo que estas haciendo, que ya lo estamos viendo porque vemos el codigo, se podria utilizar para explicar de forma muy corta para que sirve cada cosa que haces. espero que se entienda. Gracias por el video!
Muchas gracias por el video, pregunta , estas envidando la password en el body para validar la auth en texto plano, no podría ser un fallo grave de seguridad? cualquiera podría capturar la llamada y saber nuestro username password y obtener el Bearer token verdad? Muchas gracias
No en realidad, siempre en cuando la conexión sea segura (https) entonces los datos se enviarán encriptados. Saludos.
Muy buen video , pero no puedo probar sin el endpoint de /login podria mostrarlo o como puedo probar el logueo ya que el token no se me genera y todos los endpoints me devuelven la respuesta 401 Unathorizate
Hola bro, excelente video aprendí un poco. Solo me quedó una duda, hay manera de hacer una especie de logout? es decir, inhabilitar el token ?
hola José. No para este proyecto, ya que el token por sí solo expirará en algún momento.