YouTube2Text

Spring Security | Implementando Spring Security + JWT — Transcript

by JAAX · 18,399 words · 2,854 segments · language en · Watch on YouTube

Full transcript

  1. 0:00qué tal gente de YouTube Sean
  2. 0:01bienvenidos de esta tercera fase del
  3. 0:02curso de desarrollo web con Spring Boot
  4. 0:04Sí yo sé que nos hemos demorado un
  5. 0:06poquito sacando esta tercera fase Pero
  6. 0:08bueno cuestión de temas personales
  7. 0:10proyectos paralelos como pueden ver pues
  8. 0:12se cambió de lugar de grabación etcétera
  9. 0:15Pero no se preocupen porque esta tercera
  10. 0:17fase viene actualizada Pues con
  11. 0:19conocimientos de Sprint Security y Jason
  12. 0:22web token que Considero que van a ser un
  13. 0:24buen Punto de partida para la gente que
  14. 0:25está aprendiendo de Spring Boot es un
  15. 0:29muy buen conocimiento que ustedes van a
  16. 0:30Añadir a su stack sobre Cómo agregar
  17. 0:32seguridad es a sus también antes que
  18. 0:35nada pues me gustaría agradecerles a las
  19. 0:38personas que han estado suscribiéndose
  20. 0:39comentando dejando un like compartiendo
  21. 0:42este vídeo porque de esa forma nos están
  22. 0:43apoyando muchísimo ya que el algoritmo
  23. 0:45de YouTube nos va a ir recomendando
  24. 0:47mucho más listo entonces sin más
  25. 0:50enrollarme podemos pasar ya ahora sí al
  26. 0:52desarrollo e implementación de Spring
  27. 0:54Security con Jason web token Así que
  28. 0:56vamos allá
  29. 0:58[Música]
  30. 1:08Bueno muy bien Ahora sí sin más
  31. 1:10dilaciones Vamos a entrar en materia
  32. 1:12Pero antes de empezar a hacer el
  33. 1:15desarrollo la implementación de Spring
  34. 1:18Security como un Jason web token me
  35. 1:20gustaría matizar y que entiendan que es
  36. 1:22un Jason web token un Jason web token en
  37. 1:25simples palabras es un estándar que nos
  38. 1:27permite a nosotros generar tokens bajo
  39. 1:29pues la estructura de un Jason Ok nada
  40. 1:32más ahora este tipo de Jason
  41. 1:36viene conformado de la siguiente manera
  42. 1:38no este tipo de Jason web token como
  43. 1:40pueden ver aquí Bueno yo utilizo esta
  44. 1:43página es muy útil por si quieren ver
  45. 1:45cómo está estructurado los tokens que
  46. 1:46ustedes generen se llama jw.io aquí
  47. 1:50nosotros podemos ver por ejemplo un
  48. 1:52token Ok Recuerden que este token está
  49. 1:55codificado en base 64 Ok por lo que de
  50. 1:59cierta forma nos permite tener este la
  51. 2:01información segura No se ve encriptada
  52. 2:03Ahora este token consta de como mencioné
  53. 2:06solamente de tres partes no la primera
  54. 2:09es el header Ok el header contiene
  55. 2:11información sobre el tipo de algoritmo
  56. 2:12que se está utilizando para para la
  57. 2:16creación de este token que en este caso
  58. 2:17en este caso es hs 256 y el tipo de
  59. 2:23token que es como pueden ver es un Jason
  60. 2:25webdock Ok entonces toda esta
  61. 2:27información como pueden ver está
  62. 2:29codificada en esta parte de aquí que es
  63. 2:31en rojo se separa por un punto y la
  64. 2:34segunda parte que nos encontramos está
  65. 2:36en morado es el payload O la información
  66. 2:38o también conocida como la carga útil
  67. 2:41del Jason web token que tiene esta parte
  68. 2:45del del token básicamente contiene la
  69. 2:48información
  70. 2:50que nosotros queremos enviar para por
  71. 2:53ejemplo en este caso autenticarnos y que
  72. 2:55se nos autorice acceder a un recurso a
  73. 2:58nuestra Api resple no Recuerden que
  74. 3:00estamos agregando seguridades Entonces
  75. 3:01ya no Simplemente voy a realizar por
  76. 3:04ejemplo un get un post
  77. 3:06simplemente consumiendo una URL sino que
  78. 3:09también tengo que identificarme para ver
  79. 3:11si es que yo tengo los permisos para
  80. 3:13acceder a ese tipo de recursos no
  81. 3:15entonces Generalmente en el Pilot se
  82. 3:18envía esta información Como por ejemplo
  83. 3:19puede ser el usuario no Y en este token
  84. 3:22de ejemplo nosotros podemos ver que pues
  85. 3:25aquí tenemos el nombre ok el nombre en
  86. 3:28este caso del usuario que está
  87. 3:30codificado en este token y también
  88. 3:33podemos ver la fecha en la que se generó
  89. 3:36este token esta parte es muy importante
  90. 3:38porque aquí nosotros podemos
  91. 3:39configurarlo a nuestra manera para darle
  92. 3:41incluso hasta una fecha de expiración a
  93. 3:44nuestro token por ejemplo decirle sabes
  94. 3:46que yo quiero que este token dentro de
  95. 3:4810 minutos ya sea caduco entonces si es
  96. 3:50que vuelven a utilizar este token pasado
  97. 3:52los 10 minutos ya no puedes acceder a
  98. 3:54ese recurso y necesitas volver a
  99. 3:56autenticarte y que te autoricen acceder
  100. 3:58a un recurso OK Pero eso lo vamos a ver
  101. 4:00más adelante no nos aceleremos y
  102. 4:02finalmente la última parte que viene
  103. 4:05contenido en el token es la firma no en
  104. 4:09como podemos ver aquí está en chat 256 y
  105. 4:12la forma de codificación es en base 64
  106. 4:14Ok y el secreto que básicamente pues es
  107. 4:19la clave secreta de nuestro servidor que
  108. 4:22nosotros estamos configurando para que
  109. 4:25se genere esto qué es lo que nos permite
  110. 4:27a nosotros validar que el token sea
  111. 4:29auténtico no que haya sido generado por
  112. 4:32el mismo servidor y así proteger nuestra
  113. 4:34información muy bien una vez que hemos
  114. 4:37matizado la estructura de lo que es un
  115. 4:39Jason web token me gustaría pues que
  116. 4:40ustedes vean Cómo funciona el mecanismo
  117. 4:42no el flujo de nosotros implementarios
  118. 4:45Security común Jason webdock funciona
  119. 4:48de la siguiente manera Ok Generalmente
  120. 4:51tenemos un cliente no que puede que como
  121. 4:54mencioné puede ser un cliente web o
  122. 4:56simplemente una petición desde un
  123. 4:57navegador lo que sea pero tenemos un
  124. 4:59cliente que nos va a enviar una petición
  125. 5:01http ya antes mencionada en otras partes
  126. 5:04del curso que puede ser get post o
  127. 5:07cualquier tipo de actividad que queramos
  128. 5:09realizar dentro de nuestra aplicación
  129. 5:12nuestro backen recibe esta petición http
  130. 5:15Ok y lo primero que se ejecuta siempre
  131. 5:18va a ejecutarse el Jason web token
  132. 5:22autentication filter que es uno que como
  133. 5:24su mismo nombre indica es un filtro de
  134. 5:26autenticación que va a validar si el
  135. 5:29Jason web token me lo estás enviando si
  136. 5:32no me lo estás enviando Okay entonces
  137. 5:34como pueden ver cuando se envía la
  138. 5:37petición http Yo ya no estoy simplemente
  139. 5:39consumiendo una URL de mi backend sino
  140. 5:43que también tengo que identificarme para
  141. 5:45ver si es que estoy autorizado a
  142. 5:47utilizar esa URL entonces junto con la
  143. 5:50petición http También nosotros envíe el
  144. 5:53cliente enviaría un token similar a este
  145. 5:56para identificarse entonces llega a este
  146. 5:59filtro de autenticación ese toque y esto
  147. 6:02me ayuda primero a verificar si es que
  148. 6:06se toquen es válido o no Ok entonces
  149. 6:09como pueden ver el flujo arranca con el
  150. 6:12filtro autenticación y por ejemplo yo
  151. 6:15saco de ese token el usuario que tú me
  152. 6:18estás mandando No es cierto en este caso
  153. 6:19sería John doe póngale de ejemplo no
  154. 6:22Entonces qué es lo que primero pasa que
  155. 6:24yo utilizo el servicio de detalles de
  156. 6:27usuario Ok y este servicio lo que me
  157. 6:30permite a mí es ir a buscar si es que
  158. 6:32ese usuario existe en base de datos es
  159. 6:34decir si está registrado ya OK entonces
  160. 6:38me dice sabes que
  161. 6:41me retorna ese usuario Ok y el filtro
  162. 6:45valida Ok si ya tiene la respuesta
  163. 6:47validada de si ese usuario existe o no
  164. 6:49En caso de que no existiera lo que nos
  165. 6:52devuelve es un status 403 forbidden que
  166. 6:55es muy conocido que es un estatus que
  167. 6:57nos está indicando que no nos autoriza a
  168. 6:59utilizar un recurso a acceder a un
  169. 7:01recurso no Entonces nos dice el usuario
  170. 7:04no existe otra forma también de la que
  171. 7:06funciona este filtro es en caso de que
  172. 7:08tú consumas este esta URL no por ejemplo
  173. 7:11envíes un get pero no no le envías
  174. 7:13ningún token también nos va a retornar
  175. 7:15un estatus 403 indicando que no hay
  176. 7:18token entonces pues obviamente no no me
  177. 7:20estás dando tu credencial no te estás
  178. 7:23identificando para acceder a este
  179. 7:24recurso Ok Muy bien esto En caso de que
  180. 7:27el token no exista o de que el usuario
  181. 7:28no exista no una vez que el filtro dice
  182. 7:31sabes qué el usuario sí existe y me
  183. 7:35estás enviando un token entramos en un
  184. 7:38proceso conocido como la validación del
  185. 7:40Jason web token en este proceso Aquí sí
  186. 7:43se verifica que el token que tú me estés
  187. 7:45enviando sea auténtico que haya sido
  188. 7:48generado por el mismo servidor para que
  189. 7:50te permita seguir accediendo al recurso
  190. 7:52en caso de que este token sea inválido
  191. 7:55lo que pasa a continuación es que te
  192. 7:57devuelve de nuevo un estatus 403
  193. 8:00indicándote que el toque más válido Ok
  194. 8:03entonces Vamos a ponernos ahora en el
  195. 8:05escenario de que sabes qué existe existe
  196. 8:09el usuario
  197. 8:10me envías un token tu token se valida y
  198. 8:14es un toque en auténtico Entonces se
  199. 8:18actualiza algo conocido como El Security
  200. 8:20context holder Ok este contexto de
  201. 8:24seguridad básicamente me indica que el
  202. 8:27usuario efectivamente está auténticado
  203. 8:30porque ha pasado el filtro de
  204. 8:32autenticación del del Jason web token y
  205. 8:35aparte de eso también
  206. 8:36pasó la validación de Jason web token
  207. 8:39Entonces se actualiza este contexto no
  208. 8:41cabe recalcar que en cada petición
  209. 8:43entonces en cada petición Yo ya voy a
  210. 8:46poder acceder a este recurso Ok y una
  211. 8:50vez que se actualiza este contexto lo
  212. 8:52que va a hacer es Acceder al disparchad
  213. 8:55server servillet que no es más que el
  214. 8:58elemento del tomcat que decide Cuál
  215. 9:00controlador es el que tú quieres
  216. 9:01utilizar no O sea si por ejemplo tú
  217. 9:03envías un get a Api usuarios entonces
  218. 9:05pues del dispatcher identifica el
  219. 9:07controlador que estás queriendo utilizar
  220. 9:09te deja acceder al controlador y te
  221. 9:11devuelve del documento en formato Jason
  222. 9:14con información que tú estás queriendo
  223. 9:15acceder o realizando la performance que
  224. 9:18tú necesitas que puede ser un pud o un
  225. 9:20delito o un post no Ok entonces
  226. 9:24básicamente Esta es la forma en la que
  227. 9:27funciona pero recuerden muy importante
  228. 9:29siempre el primer elemento que se lanza
  229. 9:32en este flujo va a ser el filtro de
  230. 9:34autenticación OK Siempre voy a verificar
  231. 9:37que me mandes un Jason web token Y que
  232. 9:39aparte de eso existe el usuario que en
  233. 9:41ese Jason tú me estás tú me estás
  234. 9:43mandando en base de datos ya
  235. 9:46bueno algo que cabe recalcar Y esto es
  236. 9:48una nota mental que deberían hacérselo
  237. 9:50Es que este tipo de filtros es son
  238. 9:52conocidos Como One request filter OK
  239. 9:55Siempre se lanza en cada petición que el
  240. 9:58cliente nos está enviando al servidor Ok
  241. 10:00Muy bien Ahora sí una vez entendido esto
  242. 10:04el contexto como es la estructura de un
  243. 10:07Jason web token como es el flujo Ahora
  244. 10:09sí podemos pasar a la implementación
  245. 10:14muy bien entonces una vez visto la parte
  246. 10:17teórica bueno el contexto de lo que se
  247. 10:20va a realizar en esta fase del curso
  248. 10:22empecemos Ahora sí a levantar nuestro
  249. 10:25proyecto este proceso ya lo realicé Pues
  250. 10:27en la primera fase les dejo por aquí el
  251. 10:29link si es que no han visto la primera
  252. 10:30fase del curso sin embargo pues me
  253. 10:33pareció pertinente
  254. 10:35continuar este esta fase del curso
  255. 10:38haciéndolo todo desde cero muy bien
  256. 10:40entonces para ello Pues bueno nos
  257. 10:43encontramos en la plataforma en la
  258. 10:45herramienta Sprint inicial izzer de
  259. 10:47Spring y lo que vamos a hacer es empezar
  260. 10:49a configurar nuestro proyecto como ya es
  261. 10:52conocido vamos a trabajar con Maiden con
  262. 10:54formato xml también vamos a utilizar
  263. 10:57Java Ok la versión de Sprint a este
  264. 11:00momento pues la estable el último
  265. 11:02Release lanzado es del 3.1.1 OK Vamos a
  266. 11:07dejarla en esa versión vamos a cambiar
  267. 11:09el grupo Vamos a ponerle jacks aquí Ok
  268. 11:12perfecto y el artefacto vamos a poner
  269. 11:15como Spring Security
  270. 11:19sí déjamelo así como
  271. 11:22Ok perfecto descripción sería fase 3 del
  272. 11:26curso de Sprint Security con
  273. 11:31jwt que en este caso son los Jason web
  274. 11:34tokens Ok perfecto
  275. 11:36vamos a dejar en la versión 17 de Java
  276. 11:39que es la más estable bueno fue lanzada
  277. 11:41hace un par de meses igual Entonces
  278. 11:43vamos a dejarla con esa con esa versión
  279. 11:47de Java y bueno Cuáles van a ser las
  280. 11:49dependencias que vamos a utilizar
  281. 11:51inicialmente simplemente vamos a
  282. 11:53utilizar las siguientes la primera es
  283. 11:57Spring web OK Para desarrollo web vamos
  284. 12:00a utilizar el driver de postres también
  285. 12:03vamos a utilizar los Dead Tools de
  286. 12:06Sprint vamos a utilizar longbook OK
  287. 12:08recuerden que no nos ayuda a nosotros a
  288. 12:11mantener un código más limpio y varias
  289. 12:13anotaciones bastante útiles en el
  290. 12:15desarrollo
  291. 12:16perfecto y también Spring Data jpa para
  292. 12:20persistencia a la base de datos perfecto
  293. 12:23por el momento voy a Añadir estas
  294. 12:25dependencias ustedes se preguntarán
  295. 12:26Bueno dónde está Spring Security starter
  296. 12:29o las dependencias de los Jason web
  297. 12:30tokens no se apresuren ya vamos a ir más
  298. 12:33adelante añadiendo las dependencias
  299. 12:34conforme vayamos necesitando ok
  300. 12:36Muy bien Entonces vamos a ver una Vamos
  301. 12:39a darle una ojeada más pues a nuestro
  302. 12:41proyecto como pueden ver versión 3.1.1
  303. 12:44de Sprint los drivers longboard tenemos
  304. 12:47starter test perfecto formato xml de pom
  305. 12:51muy bien Vamos a cerrar y vamos a
  306. 12:53proceder a generar nuestro proyecto ya
  307. 12:55se ha descargado nuestro proyecto y
  308. 12:57ahora vamos a abrirlo con intelligent
  309. 13:01perfecto ya hemos abierto nuestro
  310. 13:02proyecto con intelligible como pueden
  311. 13:06ver pues ya se están haciendo bueno
  312. 13:08descargando las dependencias desde el
  313. 13:10repositorio de Maiden Ok entonces pues
  314. 13:13bueno ya hemos abierto vamos a ver cómo
  315. 13:16está la estructura de nuestro proyecto
  316. 13:18como pueden ver aquí está pues la
  317. 13:19carpeta src y todo mientras está
  318. 13:21haciendo el buil del proyecto Ok
  319. 13:23entonces lo que tenemos que hacer a
  320. 13:25continuación es esperar que se
  321. 13:27sincronicen todas las dependencias
  322. 13:28revisamos que esté todo correcto aquí de
  323. 13:31una vez en nuestro archivo ML perfecto
  324. 13:33el nombre Sprint Security fase 3 del
  325. 13:36curso de Spring Security con Jason web
  326. 13:38tokens muy bien perfecto entonces bueno
  327. 13:41Esto dependiendo de la conexión que
  328. 13:43ustedes tengan internet y al ir
  329. 13:44descargando las dependencias y se
  330. 13:46actualizará nuestro proyecto Ok entonces
  331. 13:50vamos a pegar un pequeño corte y ya
  332. 13:52volveremos cuando se haya sincronizado
  333. 13:57muy bien entonces en este momento como
  334. 14:00pueden ver tenemos ya sincronizado
  335. 14:02nuestro proyecto Ok y podemos empezar a
  336. 14:05trabajar sobre ello ahora si ustedes
  337. 14:08recuerdan Pues en el en el gráfico no en
  338. 14:11el diagrama que yo les presente Pues
  339. 14:13todo este proyecto todo esta
  340. 14:15implementación que nosotros vamos a
  341. 14:16realizar de Spring Security es para
  342. 14:19proteger este el acceso a este a esta a
  343. 14:24este backen no o en este caso a una Api
  344. 14:26redfoll que pues tiene recursos que
  345. 14:28pueden ser consumidos desde un cliente
  346. 14:30externo Ok entonces bueno Esto es algo
  347. 14:34que ya hemos hecho básicamente pero pues
  348. 14:37no no se pierde nada
  349. 14:39volviéndolo hacer vamos a crear una una
  350. 14:42un pequeño controlador Ok entonces vamos
  351. 14:45a crear nuestro paquete
  352. 14:47controller OK
  353. 14:49Vamos a crear una nueva clase que se
  354. 14:55llame saludo control
  355. 14:57[Música]
  356. 15:00perfecto vamos a indicarle Spring que es
  357. 15:03después un controlador Ok un controlador
  358. 15:06de tipo Rest
  359. 15:08un controlador de tipo Rest muy bien
  360. 15:11Vamos a colocar aquí la anotación Rest
  361. 15:14controller perfecto y vamos a crear un
  362. 15:18en Point no vamos a colocar Bueno vamos
  363. 15:20a colocarle Aquí también vamos a
  364. 15:22mantener un estándar no vamos a indicar
  365. 15:24que es mapping va a ser
  366. 15:27Slash Api Slash
  367. 15:31rating Ok y vamos a colocar aquí un en
  368. 15:35Point que sea get de tipo get y vamos a
  369. 15:39indicarle que este en Point va a ser 6
  370. 15:43Hello por ejemplo muy bien Vamos a crear
  371. 15:46un álbum que nos devuelva un String 6
  372. 15:49Hello perfecto
  373. 15:52nos va a retornar un String que diga
  374. 15:55Hello from Happy jacks por ejemplo muy
  375. 16:01bien entonces Bueno antes de continuar
  376. 16:04pues vamos a guardar obviamente vamos a
  377. 16:07intentar levantar este proyecto vamos a
  378. 16:09ver si es que nos arroja algún tipo de
  379. 16:11excepción no Ok entonces vamos a ver
  380. 16:16que nos indica habilitamos el
  381. 16:18procesamiento de anotaciones de longbook
  382. 16:19Ok Muy bien Y como pueden ver pues este
  383. 16:22nos arroja una primera excepción y es
  384. 16:24que si ustedes recuerdan yo añadí el
  385. 16:27driver de postres no O sea tiene que
  386. 16:30haber una conexión a una base de datos
  387. 16:32sql Y es lo que nos está indicando aquí
  388. 16:35prácticamente no nos dice que podemos
  389. 16:38poner una base de datos de embebida como
  390. 16:40h2 dhsql como la que trabajamos en la
  391. 16:43primera fase Y también puedes conectarlo
  392. 16:46a una base de datos como tal Ok entonces
  393. 16:48en este momento qué es lo que voy a
  394. 16:49hacer a continuación básicamente es
  395. 16:52copiar la configuración que ya hemos
  396. 16:55realizado Pues en vídeos anteriores a
  397. 16:59una base de datos ok
  398. 17:01muy bien entonces ya tenemos aquí ya la
  399. 17:04configuración en nuestro archivo
  400. 17:06application properties recuerden Pues
  401. 17:08que este archivo es bastante importante
  402. 17:09porque aquí se definen varias
  403. 17:11configuraciones no en este en esta fase
  404. 17:13del curso pues para ahorrarme tiempo no
  405. 17:14vamos a hacer nada de archivos punto gml
  406. 17:17Eso ya depende de la predilección y su
  407. 17:19preferencia si les gusta trabajar más
  408. 17:21con properties o con punto y ML Ok
  409. 17:23Perfecto entonces ya tenemos aquí la
  410. 17:26configuración para conectarnos a nuestra
  411. 17:28base de datos Recuerden que estamos
  412. 17:30trabajando con una base de datos postres
  413. 17:32entonces Bueno aquí está aquí tenemos
  414. 17:34creada dicha base de datos ya
  415. 17:37previamente Ok se llama Sprint Security
  416. 17:40datase Bueno es un nombre que le puse
  417. 17:42así para fines prácticos entonces aquí
  418. 17:45está la cadena de conexión y las
  419. 17:47credenciales de acceso y todo Entonces
  420. 17:48vamos a guardar cambios vamos Ahora sí a
  421. 17:52levantar nuestra aplicación y veamos si
  422. 17:55es que no ocurre ningún otro tipo de
  423. 17:56excepción
  424. 17:59Ok como pueden ver ya nuestra nuestra
  425. 18:02Api se ha levantado Ok perfecto vemos
  426. 18:06que la aplicación se ha inicializado y
  427. 18:09vamos a ver si en nuestro controlador
  428. 18:11está funcionando Perfecto entonces vamos
  429. 18:13a ir a nuestro navegador ok vamos a
  430. 18:15poner aquí local
  431. 18:18Host Ok puntos 80 85 es lash Api
  432. 18:24slashping Slash 6 Hello
  433. 18:28Ok y nos devuelve un Hello froms Ok
  434. 18:32entonces nuestra Api está levantada
  435. 18:34ahora para qué hice esto básicamente
  436. 18:35para ejemplificar que en este momento no
  437. 18:39hemos añadido ningún tipo de seguridad
  438. 18:41es a nuestro proyecto simplemente hemos
  439. 18:44creado un en Point al cual pues Nosotros
  440. 18:47le vamos a agregar seguridad es
  441. 18:49utilizando Spring Security y Jason web
  442. 18:52tokens Ok Perfecto entonces eso es lo
  443. 18:56que vamos a hacer a continuación
  444. 18:58implementar Springs
  445. 19:03muy bien entonces continuando con lo que
  446. 19:06venimos haciendo de la implementación
  447. 19:09aquí tenemos pues nuestro primer en
  448. 19:11Point que nosotros creamos y al que le
  449. 19:13queremos brindar seguridad Entonces
  450. 19:15ahora sí para empezar con la
  451. 19:17implementación vamos a ir a nuestro
  452. 19:18archivo de configuración pom y vamos a
  453. 19:21copiar la dependencia de Sprint starter
  454. 19:24Security Ok entonces para eso nosotros
  455. 19:26vamos a hacer un Maiden update OK Vamos
  456. 19:29a detener la aplicación un rato perfecto
  457. 19:31esperemos que se sincronice la
  458. 19:34dependencia de nuestro en nuestro
  459. 19:36proyecto muy bien ya sea sincronizado y
  460. 19:39ahora lo que vamos a hacer primero Bueno
  461. 19:41yo lo que primero quiero hacer es crear
  462. 19:44un nuevo paquete ok En este caso va a
  463. 19:46ser el de entity perfecto
  464. 19:50muy bien Ahora qué es lo que vamos a
  465. 19:52hacer vamos a crear nuestra entidad
  466. 19:54usuario OK Porque ahora queremos guardar
  467. 19:58en nuestra base de datos usuarios
  468. 19:59obviamente Entonces vamos a crear
  469. 20:01nuestra clase user Ok aquí tenemos
  470. 20:04nuestra clase user y bueno vamos a
  471. 20:06definir los atributos obviamente vamos a
  472. 20:09necesitar un ID también vamos a
  473. 20:12necesitar un
  474. 20:14bueno Considero que un primer nuestro
  475. 20:17nombre también vamos a tener nuestro
  476. 20:20apellido OK Vamos a manejar el email que
  477. 20:25va a funcionar como el usuario Ok va a
  478. 20:27ser String perfecto vamos a colocar la
  479. 20:31clave que sería String password muy bien
  480. 20:35estos son los atributos que a priori
  481. 20:37manejaría nuestra entidad Entonces vamos
  482. 20:39a anotarle como entity utilizando
  483. 20:42jacareta persistentes OK Vamos a
  484. 20:45definirlo como una entidad y como hemos
  485. 20:47venido haciendo Porque queremos evitar
  486. 20:49problemas de palabras reservadas de
  487. 20:52lenguaje en este caso nuestra base de
  488. 20:54datos de postres y user es una de las
  489. 20:55palabras reservadas entonces para
  490. 20:57evitarnos de ese problema Vamos a darle
  491. 20:59nuestro nombre a la tabla Y en este caso
  492. 21:02se mapearía como tbl y usa perfecto
  493. 21:06Vamos a darle vamos a colocarle longbook
  494. 21:10Ok Data para que resetters los
  495. 21:12constructores con el constructor de con
  496. 21:15todos los parámetros del constructor
  497. 21:17vacío y finalmente nuestro patrón
  498. 21:20builder muy bien perfecto
  499. 21:24ahora vamos a indicar cuál va a ser el
  500. 21:26ID
  501. 21:27muy bien y el General la forma en la
  502. 21:30degeneración de valores Entonces vamos a
  503. 21:32definir la estrategia como ya lo hicimos
  504. 21:34en la segunda fase de este curso vamos a
  505. 21:38colocar un generation type a identity en
  506. 21:41este caso para ahorrarnos más tiempo no
  507. 21:43quiero si pueden si no hay identidad
  508. 21:44perfecto nuestra entidad ahorita ya está
  509. 21:46configurada no es nada que no hayamos
  510. 21:48hecho ahora
  511. 21:50algo muy importante y aquí si ya viene
  512. 21:53un tema de Sprint Security vamos a
  513. 21:56utilizar e implementar esta entidad va a
  514. 21:59implementar una clase que se llama usert
  515. 22:02details Ok implements usert details como
  516. 22:06pueden ver es de ork Spring framework
  517. 22:09Security Core Ok entonces vamos a
  518. 22:11implementar esta clase como ven va a
  519. 22:13haber errores Entonces nos va a pedir
  520. 22:15que implementemos los métodos también
  521. 22:16podemos poner el cursor aquí arriba y
  522. 22:18aquí dice implementar métodos entonces
  523. 22:20son todos estos los métodos que nosotros
  524. 22:22necesitamos implementar
  525. 22:25perfecto Ok Recuerden que esta clase Ya
  526. 22:29pertenece a el corte de Spring Security
  527. 22:32Ok entonces veamos Cuáles son los
  528. 22:34métodos que se implementaron Pues en
  529. 22:37esta en nuestra entidad como pueden ver
  530. 22:39tenemos un método que se ya que nos da
  531. 22:45las autoritis no las autorities que no
  532. 22:48son más que
  533. 22:49[Música]
  534. 22:50la que los roles que tendría en este
  535. 22:52caso el usuario no Recuerden que pues
  536. 22:54hay sistemas en los que se manejan
  537. 22:55diferente tipo de permisos accesos como
  538. 22:58puede ser por ejemplo administrador un
  539. 23:00usuario simple super administrador
  540. 23:02etcétera Ok entonces este método nos
  541. 23:05ayuda a gestionar eso Entonces cuando
  542. 23:07nosotros estamos hablando de autoritis
  543. 23:09obviamente vamos a necesitar roles no
  544. 23:12cierto Entonces para eso nosotros lo que
  545. 23:15vamos a hacer a continuación es crear
  546. 23:17un enumerado Ok
  547. 23:20un enumerado que se llame
  548. 23:25Vamos a ponerle error Perfecto entonces
  549. 23:28este numerador rol va a tener dos roles
  550. 23:30Vamos a ponerle un usuario normal y va a
  551. 23:34tener un administrador nada más OK este
  552. 23:37va a ser estos van a ser los roles
  553. 23:39disponibles en nuestra aplicación
  554. 23:41entonces obviamente tenemos que nosotros
  555. 23:44pues este
  556. 23:46indicar que va a haber un atributo de
  557. 23:48tipo roles no en nuestra entidad y en
  558. 23:50este caso lo que vamos a colocar es un
  559. 23:53private
  560. 23:55[Música]
  561. 24:01perfecto pero tenemos que indicar que
  562. 24:04esto es un enumerado
  563. 24:08Okay perfección perfecto y vamos a
  564. 24:11indicarle que es un tipo de numerado
  565. 24:13ordinal muy
  566. 24:16bien entonces ya nosotros estamos
  567. 24:18indicando el rol entonces Dentro de este
  568. 24:20método lo que nosotros vamos a retornar
  569. 24:22es un una lista punto off una lista de
  570. 24:27elementos que va a ser un New simple
  571. 24:31durante
  572. 24:33autority Ok va a ser una New simple y
  573. 24:38vamos a
  574. 24:39retornar el nombre del rol que tiene
  575. 24:42este usuario perfecto ahora veamos Qué
  576. 24:45métodos más tienen dice que nos permite
  577. 24:49devolver el usuario Perfecto entonces
  578. 24:51vamos a retornar
  579. 24:53el nombre de usuario que en este caso
  580. 24:55sería nuestro email Recuerden que
  581. 24:57nosotros vamos a utilizar para este caso
  582. 24:58el email como el usuario en nuestra
  583. 25:01aplicación ya depende de ustedes ustedes
  584. 25:03pueden utilizar First o hacer que el
  585. 25:06usuario crea un nombre de usuario No ya
  586. 25:08son customizaciones que ustedes le Irán
  587. 25:11dando
  588. 25:13Próximamente Ok entonces tenemos más
  589. 25:16métodos por ejemplo encontramos un par
  590. 25:18de bolivianos aquí ya como por ejemplo
  591. 25:21es un boleano que nos indica que esta
  592. 25:23cuenta este usuario no ha expirado Ok
  593. 25:26entonces aquí nosotros vamos a retornar
  594. 25:29por defecto Trump ustedes también pueden
  595. 25:31este customizar estos métodos agregar
  596. 25:34métodos que les permitan pues validar si
  597. 25:36el usuario ya expirado tal vez esta
  598. 25:39cuenta ya caducado se puede hacer de
  599. 25:41todo con este tipo de con esta clase
  600. 25:44user details no También tenemos un
  601. 25:46método booleano que nos valida si es que
  602. 25:50la cuenta no ha sido bloqueada no como
  603. 25:52pueden ver hay varios sistemas por
  604. 25:54ejemplo no Facebook asumamos que en
  605. 25:56Facebook te has comportado mal y pues
  606. 25:58Facebook te bloqueó la cuenta para que
  607. 26:00ya no puedas acceder entonces este tipo
  608. 26:02de métodos nos ayudan a eso en este caso
  609. 26:04por defecto vamos a retornar true porque
  610. 26:06pues no queremos que ninguna cuenta esté
  611. 26:09bloqueada Ok aquí hay otro booleano que
  612. 26:12nos indica si credenciales no han
  613. 26:14expirado Ok entonces vamos a retornar un
  614. 26:18trío igual y si es que el usuario está
  615. 26:20habilitado no Recuerden que pueden haber
  616. 26:22lógicas de negocio detrás en donde
  617. 26:25cuando se crea un usuario ese usuario
  618. 26:27todavía está deshabilitado y se necesita
  619. 26:30pues posteriormente mediante un correo
  620. 26:33electrónico realizar una activación de
  621. 26:35ese usuario Ok Déjenme los Déjenme en
  622. 26:39los comentarios si es que les
  623. 26:40interesaría tal vez realizar una
  624. 26:41implementación similar los estaremos
  625. 26:43leyendo y estaremos considerando hacerlo
  626. 26:45entonces en este caso voy a poner por
  627. 26:47defecto true OK Para que este usuario o
  628. 26:51todos los usuarios que yo vaya creando
  629. 26:53pues estén habilitados no estén
  630. 26:55caducados no estén bloqueados perfecto
  631. 26:57sin embargo
  632. 26:59me falta un ghetter aquí Ok y es el del
  633. 27:04password no necesita también obtener el
  634. 27:06password entonces pues aquí Qué es lo
  635. 27:09que está pasando Pues por qué no me no
  636. 27:12nos no me sobres no me sobrecargue ese
  637. 27:13get es por mi anotación de Data Ok
  638. 27:16entonces Vamos a ponerle aquí
  639. 27:20Vamos a ponerle password 1 ok
  640. 27:25y vamos a hacer implementar ese método
  641. 27:27que me está faltando Ahí está get
  642. 27:29password Ok ahí tenemos get password y
  643. 27:32ya ponemos borrarle el uno que le
  644. 27:34colocamos aquí eso es un Life hacker que
  645. 27:37Les recomiendo y ahí sí vamos a retornar
  646. 27:39el password Perfecto entonces ya tenemos
  647. 27:42nuestra entidad configurada
  648. 27:52Perfecto entonces una vez que nosotros
  649. 27:54ya tenemos configurada nuestra entidad
  650. 27:56usuario no que es con la que vamos a
  651. 27:58gestionar los usuarios que van a tener
  652. 28:00acceso dentro de nuestra aplicación
  653. 28:02vamos a correr esta aplicación para que
  654. 28:05hyberney pues bueno mapee esta entidad
  655. 28:07Pues a la base de datos primero que nada
  656. 28:09entonces esperemos que se levante la
  657. 28:12aplicación okay entonces aquí está el
  658. 28:15ROM perfecto
  659. 28:19muy bien
  660. 28:20Ahí está hibernate ha hecho su trabajo
  661. 28:24como es debido Y si ustedes se fijan
  662. 28:27aquí Pues básicamente está utilizando
  663. 28:29algo que se llama using generated
  664. 28:31Security password que básicamente es la
  665. 28:34protección que por defecto viene cuando
  666. 28:37nosotros incluimos este tipo de
  667. 28:38librerías no a nuestra aplicación de
  668. 28:42Spring Boot entonces de cierta forma
  669. 28:44pues ya se protegen cualquier tipo de
  670. 28:47petición URL que nosotros creemos sin
  671. 28:49embargo nosotros vamos a customizar esa
  672. 28:53protección pero lo que podemos ya ver
  673. 28:55por el momento es que nosotros se
  674. 28:57refrescamos el esquema de base de datos
  675. 28:59que tenemos ya tenemos nuestra tabla
  676. 29:01user Y si yo hago un Select a esta tabla
  677. 29:04Okay
  678. 29:05Select from TV user
  679. 29:10Ahí está nuestra tabla con todos los
  680. 29:12campos que nosotros queremos manejar que
  681. 29:13es email First name Last name password y
  682. 29:16Rock Perfecto entonces cuál es el
  683. 29:18siguiente paso hacer a continuación Pues
  684. 29:21bueno vamos a crear un nuevo paquete
  685. 29:23Esto es algo que también ya hemos hecho
  686. 29:25en cursos anteriores Y vamos a crear un
  687. 29:27repositorio OK Para poder gestionar con
  688. 29:29jpa la entidad que nosotros creamos de
  689. 29:32user Entonces tenemos el repositorio
  690. 29:35perfecto creamos la nueva en este caso
  691. 29:38Recuerden que es una interfaz lo que
  692. 29:41nosotros vamos a manejar Aquí sí que
  693. 29:42vamos a colocar user repositor
  694. 29:45perfecto
  695. 29:47como es normal vamos a extender Ok de la
  696. 29:53interfaz de jpa repository OK Y ustedes
  697. 29:57recuerden Pues que aquí es maneja la
  698. 30:00clase con la que estamos nosotros
  699. 30:01trabajando Y también vamos a enviar el
  700. 30:04tipo de ID de esta entidad y vamos a
  701. 30:08anotarlo como un repositorio Perfecto
  702. 30:11entonces cuál es el método que nosotros
  703. 30:13vamos a configurar aquí que nosotros
  704. 30:15vamos a necesitar Pues básicamente
  705. 30:17un opcional
  706. 30:21Ok en opcional
  707. 30:26y vamos a traer este usuario
  708. 30:29por find user by email Recuerden que
  709. 30:34nosotros estamos utilizando
  710. 30:37el email como el usuario para poder
  711. 30:40nosotros loguearnos en la aplicación Ok
  712. 30:42Perfecto entonces ya hemos creado el
  713. 30:46repositorio
  714. 30:51muy bien una vez que nosotros hemos
  715. 30:53creado Pues el repositorio para poder
  716. 30:55gestionar nuestro usuario Ahora sí vamos
  717. 30:58a entrar en un poco de la implementación
  718. 31:00del esquema que yo les mostré pues al
  719. 31:03inicio no Ok entonces Bueno vamos a
  720. 31:06corregir esto de aquí sería user
  721. 31:09repository no repositoriotti
  722. 31:14[Música]
  723. 31:19perfecto
  724. 31:24ya perfecto
  725. 31:26Entonces ahora sí una vez que hemos
  726. 31:30corregido nosotros esto ya tenemos
  727. 31:31nuestro repositorio nuestra entidad y si
  728. 31:33nosotros vamos de nuevo Pues a nuestro
  729. 31:35diagrama ustedes van a ver bueno
  730. 31:38recordarán que yo les mencioné que
  731. 31:39siempre el filtro de autenticación es lo
  732. 31:42primero en lanzarse siempre en cada
  733. 31:44petición que se va a hacer hacia nuestro
  734. 31:46servidor no en este caso puede ser get
  735. 31:49post put o delete Ok entonces vamos a
  736. 31:52empezar con la implementación de esto y
  737. 31:55con la implementación de esto Y a medida
  738. 31:57que vayamos construyendo vamos a ver
  739. 31:59cómo nuestro proyecto va tomando forma
  740. 32:01en base a este esquema que se está
  741. 32:03presentando no Entonces para empezar con
  742. 32:06la implementación de esto nosotros vamos
  743. 32:07a regresar Pues a nuestro proyecto Ok y
  744. 32:12vamos a crear un nuevo
  745. 32:17y vamos a crear un nuevo paquete en este
  746. 32:19caso vamos a llamarle upsi un nuevo
  747. 32:23paquete en este caso que se va a llamar
  748. 32:25cómic OK Y en este paquete aquí nosotros
  749. 32:28vamos pues a crear todas las clases de
  750. 32:30configuración para poder establecer
  751. 32:31seguridad desde nuestra apio Ok entonces
  752. 32:34vamos a crear una nueva clase en este
  753. 32:36caso vamos a empezar con la construcción
  754. 32:38del filtro no Entonces vamos a ponerle
  755. 32:41jwbt filter de nombre Perfecto entonces
  756. 32:46esta clase lo que va a hacer va a ser
  757. 32:49extender métodos Pues de una interfaz
  758. 32:53que se llama One filter Recuerden que yo
  759. 32:55les mencioné que siempre este filtro es
  760. 32:59se va a ejecutar una vez en cada
  761. 33:01petición una vez en cada petición por
  762. 33:03eso se llama One request filter Ok si
  763. 33:06somos un poquito curiosos y vamos
  764. 33:07entrando a la clase a la interfase
  765. 33:09ustedes van a ver que está extiende de
  766. 33:11llenar el filter Bean y de la de la
  767. 33:14clase base Pues que
  768. 33:16que es filter no que funciona como un
  769. 33:19filtro y ya depende de ustedes si le
  770. 33:21meten un poquito más de investigación y
  771. 33:22van a ver que incluso hasta
  772. 33:23implementando filter como tal también se
  773. 33:26puede realizar el mismo proceso pero en
  774. 33:28este caso vamos a utilizar las
  775. 33:29herramientas que ya Spring Nos está
  776. 33:31dando Y en este caso vamos a utilizar
  777. 33:33One request filter Ok entonces
  778. 33:35importante vamos a anotar esta clase
  779. 33:38como componente para que sea
  780. 33:40identificada en el radar de Sprint del
  781. 33:42contenedor de Sprint para que actúe como
  782. 33:44un Bin también que tiene que ser
  783. 33:45ejecutado y vamos a colocarle que vamos
  784. 33:48a definir
  785. 33:50el constructor como requerido Ok
  786. 33:53entonces sería recuerded arts
  787. 33:55constructor Ok perfecto ahora como
  788. 33:58ustedes pueden ver me asomo un error y
  789. 34:00por qué porque tenemos que implementar
  790. 34:01los métodos el método más claro
  791. 34:04importante de esta clase que es del
  792. 34:06método filter interna perfecto
  793. 34:08implementamos el método vamos a ordenar
  794. 34:10un poquito este código aquí para que sea
  795. 34:12un poco más legible Ok importante que
  796. 34:15tenemos aquí dos filter internet recibe
  797. 34:18tres parámetros no en la ejecución de
  798. 34:21este método el primero es el request Qué
  799. 34:24es el request cabe recalcar que el
  800. 34:26request es lo que el cliente nos envía
  801. 34:29en la petición es decir lo que el
  802. 34:31cliente está mandando en su petición
  803. 34:33http Ok entonces este este ya van a ver
  804. 34:38tiene varios elementos internos que
  805. 34:41nosotros vamos a necesitar manipular
  806. 34:43para poder este llevar a cabo nuestro
  807. 34:45filtrado no que tenemos luego es el
  808. 34:49server response es lo que nosotros
  809. 34:51debemos de entregar al cliente una vez
  810. 34:53procesada su solicitud y filterchain
  811. 34:56Pues básicamente es un elemento que
  812. 34:58nosotros nos va a permitir a permitir
  813. 35:00pues este continuar con el proceso de la
  814. 35:03solicitud una vez que nosotros hayamos
  815. 35:04filtrado ok Ya lo vamos a ver cómo
  816. 35:06funciona
  817. 35:07entonces bueno en este caso para este
  818. 35:11para este caso en específico yo voy a
  819. 35:14pedir que por favor sean no nulos los
  820. 35:18valores que se envíen a este
  821. 35:21a este a este a este a este método Ok Ok
  822. 35:25Bueno Perfecto entonces qué es lo que
  823. 35:27vamos a necesitar a continuación bueno
  824. 35:28primero vamos a definir una variable va
  825. 35:32en el String en este caso se va a llamar
  826. 35:34Perdón out Head Ok y este out header es
  827. 35:39el header de autorización que nosotros
  828. 35:42vamos a necesitar y lo vamos a tomar del
  829. 35:44request OK Vamos a tomarle Get header
  830. 35:47out resecation que ustedes me dirán Alex
  831. 35:51Cómo sabes de dónde sale este este
  832. 35:54header de autorización si ustedes han
  833. 35:55sido un poco curiosos O tal vez alguna
  834. 35:57vez han visto aquí en postman o
  835. 35:59cualquier otra herramienta para testear
  836. 36:00apis ustedes van a fijarse que tenemos
  837. 36:03aquí un un encabezado de autorización
  838. 36:07que que se envía en cada petición no por
  839. 36:10ejemplo en este caso pues no no nos está
  840. 36:12enviando nada pero ustedes van a ver
  841. 36:14aquí que tenemos diferentes formas de de
  842. 36:17autenticación como a piquín
  843. 36:19y JW TV o el protocolo auto Dos punto
  844. 36:24cero o uno punto cero etcétera Ok
  845. 36:27entonces qué es lo que estoy indicando
  846. 36:28aquí sabes que voy a obtener el header
  847. 36:31de autorización Ok entonces voy a ver
  848. 36:36primero Aquí estoy validando si me están
  849. 36:37mandando algo en este header
  850. 36:40muy bien ya les voy a ir explicando un
  851. 36:42poquito más a fondo Vamos a continuar
  852. 36:44vamos a definir un String que va a ser
  853. 36:47nuestro Jason web token Y también vamos
  854. 36:49a necesitar un String que sea el email
  855. 36:52del usuario Recuerden que nosotros el
  856. 36:54email lo estamos utilizando como el
  857. 36:57usuario para poder autenticarse dentro
  858. 36:58de nuestro sistema perfecto ahora qué es
  859. 37:01lo que vamos a hacer a continuación
  860. 37:02Vamos a entrar en la primera validación
  861. 37:05ya de nuestro filtro y es que vamos a
  862. 37:08indicar lo siguiente primero
  863. 37:12si nuestro
  864. 37:15si nuestro out header Es nulo OK o
  865. 37:22si nuestro
  866. 37:25si nuestros y nuestros y nuestro out
  867. 37:28header
  868. 37:29no empieza con
  869. 37:33Beer Ok si uno empieza con beatter
  870. 37:36Entonces vamos a utilizar Chain
  871. 37:39Recuerden que este filter chine es el
  872. 37:40que tengo como parámetro aquí que se
  873. 37:42está inyectando y que me va a permitir a
  874. 37:44mí continuar con el proceso no Entonces
  875. 37:46vamos a
  876. 37:49continuar con nuestro proceso le
  877. 37:50enviamos request response y simplemente
  878. 37:52vamos a retornar la petición OK ahora
  879. 37:56qué estoy haciendo en este filtro
  880. 37:57ustedes recordarán que yo mencioné que
  881. 38:01aquí justo aquí en nuestro filtro de
  882. 38:04autenticación se valida si el usuario en
  883. 38:07su petición me está enviando primero que
  884. 38:10nada un Jason web Ok entonces qué es lo
  885. 38:14que estoy haciendo aquí primero
  886. 38:15verificar que me esté mandando un header
  887. 38:18de autorización es decir un Jason
  888. 38:20webdock si es que es igual a nulo si es
  889. 38:23que es igual a nulo retorna y te voy a
  890. 38:25devolver un estatus 403 porque no me
  891. 38:28estás enviando tus credenciales de
  892. 38:29acceso al sistema Ahora si me envías
  893. 38:31unas credenciales Pero estas
  894. 38:33credenciales no empiezan con bitter
  895. 38:35porque el tipo de autenticación que
  896. 38:37estoy utilizando en el token es Beer
  897. 38:39sino Si no si no empieza con esto De
  898. 38:43igual forma yo te voy a devolver un 403
  899. 38:45y no te voy a permitir autenticarte Ok
  900. 38:48eso es lo en la primera validación que
  901. 38:50nosotros vamos a realizar en este método
  902. 38:52de filter interna Ya suponiendo que en
  903. 38:56este caso bueno se pasa esta validación
  904. 38:59sabes qué me estás enviando un Jason web
  905. 39:01token empieza con beatter perfecto
  906. 39:04continuamos con el filtrado ahora vamos
  907. 39:07a Ahora sí a decir sabes qué tu Jason
  908. 39:10web token parece válido Así que voy a
  909. 39:13tomar de lado header y voy a tomar del
  910. 39:16Super String 7 Porque 7 Porque
  911. 39:19Generalmente cuando se envía un beatter
  912. 39:21token vamos a ponerles un ejemplo aquí
  913. 39:25aquí mismo digamos que cuando se envía
  914. 39:28la petición siempre empieza con bitter
  915. 39:31un espacio y aquí viene el token no este
  916. 39:35en este caso sería el token entonces
  917. 39:36obviamente yo voy a tomar este valor de
  918. 39:39aquí es por eso que el out header le
  919. 39:41mando con un sub String de 7 para que
  920. 39:43desde El séptimo carácter es decir 1 2 3
  921. 39:464 5 6 7 desde aquí se tome el token y
  922. 39:50esta parte de aquí ya entraría en este
  923. 39:52String que yo declaré en un inicio OK
  924. 39:54Para que se entienda vamos a borrarlo
  925. 39:57perfecto una vez que nosotros definimos
  926. 40:00el Jason web token vamos a este
  927. 40:03web token y vamos a definir el email
  928. 40:06para esto vamos a necesitar un servicio
  929. 40:08Ok que
  930. 40:11vamos a necesitar un servicio con un
  931. 40:14método que sea get user Ok este servicio
  932. 40:18todavía no lo creo ya lo vamos a crear y
  933. 40:21vamos a enviarle aquí nuestro Jason web
  934. 40:23Talk perfecto
  935. 40:25continuemos ya te definí el Jason web
  936. 40:28token que me estás enviando y quiero
  937. 40:29extraer el email de este Jason web token
  938. 40:33que tú me estás enviando perfecto ahora
  939. 40:35vamos a entrar en la siguiente
  940. 40:37validación y vamos a indicar Sabes qué
  941. 40:39Si es que el usuario en este caso pues
  942. 40:42es nulo Ok si es que el usuario es nulo
  943. 40:45y también quiero verificar si es que el
  944. 40:48contexto de
  945. 40:50el contexto de seguridad punto get
  946. 40:53context
  947. 40:55authentication es nula
  948. 40:59vas a proseguir con tu proceso de
  949. 41:01autenticación que estoy validando aquí
  950. 41:03para recapitular Primero quiero ver que
  951. 41:06el usuario pues no se anula no y segundo
  952. 41:10Quiero ver que no exista una y que en
  953. 41:13esta petición ya no estés autenticado
  954. 41:14porque sería pues este un poco una
  955. 41:18pérdida de tiempo que por ejemplo en
  956. 41:19este caso si tú estás autenticado
  957. 41:21continuar con el proceso de
  958. 41:22autenticación si todavía no lo estás no
  959. 41:25entonces Bueno aquí estoy simplemente
  960. 41:28validando que
  961. 41:30que este que este usuario pues no esté
  962. 41:33autenticado Ok entonces perfecto
  963. 41:36[Música]
  964. 41:39Ah perdón No es que sea igual a nulo
  965. 41:41sino que sea diferente de uno es decir
  966. 41:43si es que el usuario es diferente de
  967. 41:44nulo y no estás autenticado Vamos a
  968. 41:47continuar con el proceso de
  969. 41:48autenticación OK ahora vamos a utilizar
  970. 41:51vamos a crear un objeto user details va
  971. 41:55a ser igual y muy importante vamos a
  972. 41:58necesitar una interfase que pertenece al
  973. 42:02Core de Spring Security que es Gears
  974. 42:04user
  975. 42:06user details service Ok entonces vamos a
  976. 42:10inyectar ese
  977. 42:11[Música]
  978. 42:12vamos a inyectar ese ese objeto Aquí
  979. 42:14vamos a colocarle aquí Perfecto es un
  980. 42:17private es un final es user details
  981. 42:21service userve Beta service OK ahora si
  982. 42:25nosotros entramos a esta interfase
  983. 42:27ustedes van a ver que nosotros tenemos
  984. 42:28un método que se llama load by user user
  985. 42:32by user name cargar el usuario por su
  986. 42:35usuario muy interesante esta interfase
  987. 42:37Ok y ahora vamos a ver por qué vamos a
  988. 42:40colocar 10 puntos
  989. 42:44y le vamos a mandar el user email
  990. 42:48perfecto
  991. 42:50OK ahora qué es lo que estoy haciendo
  992. 42:52aquí si nosotros regresamos a nuestro
  993. 42:56a nuestro gráfico ustedes van a ver aquí
  994. 42:58que tengo el user detail service Ok y
  995. 43:02este user del service lo que hace es
  996. 43:04básicamente ir directo a mi base de
  997. 43:07datos y verificar que mediante el email
  998. 43:10este usuario realmente exista dentro de
  999. 43:13mi sistema Ok entonces como ustedes
  1000. 43:16pueden ver ya va tomando un poco de
  1001. 43:17forma la implementación de este esquema
  1002. 43:20no de seguridad dentro de nuestra
  1003. 43:22aplicación entonces muy importante Ya
  1004. 43:25estamos entrando aquí en usert de Tales
  1005. 43:27sir Ok entonces bueno
  1006. 43:29tomate service y lo que voy a hacer es
  1007. 43:32este validar validar realizar la
  1008. 43:37siguiente validación Ok este servicio
  1009. 43:39que aún no lo creamos Ok va a tener un
  1010. 43:42método que se llame
  1011. 43:49validate talking OK Vamos a llamarlo así
  1012. 43:53Ok entonces aquí qué es lo que estamos
  1013. 43:55validando
  1014. 43:58si el token es válido en este caso ya
  1015. 44:01estaríamos entrando en la parte de aquí
  1016. 44:02Ok validar si es que el token es válido
  1017. 44:04Ok
  1018. 44:06si no pues si es válido Vamos a
  1019. 44:09continuar con el proceso sino vamos a
  1020. 44:11retornar de un 403 Ok validar si es que
  1021. 44:14este token es auténtico más que nada
  1022. 44:15entonces así lo que vamos a hacer es
  1023. 44:17enviar un Jason web token Ok y aparte de
  1024. 44:20nuestro Jason web token lo que vamos
  1025. 44:21también a enviar Es los detalles del
  1026. 44:24usuario perfecto
  1027. 44:27entonces obviamente este método lo que
  1028. 44:29nos va a retornar es un booleano
  1029. 44:32continuamos con el proceso
  1030. 44:36Ok entonces si el token es válido lo que
  1031. 44:41vamos a hacer ahora sí es crear un
  1032. 44:43objeto que es user name password
  1033. 44:45authentication token ok
  1034. 44:49vamos a colocarle igual Bueno muy muy
  1035. 44:52largo ese nombre vamos a poner
  1036. 44:53autentication token estamos construyendo
  1037. 44:55el token y vamos a crear el objeto y en
  1038. 44:59su constructor lo que vamos a hacer es
  1039. 45:01enviar los user details vamos a enviar
  1040. 45:03ahorita vamos a enviar las credenciales
  1041. 45:05como nulos Y también vamos a enviar los
  1042. 45:09autoritarios no los permisos que en este
  1043. 45:11caso el usuario tiene y una vez que
  1044. 45:13nosotros enviamos de los permisos vamos
  1045. 45:15a crear los detalles de nuestra petición
  1046. 45:17no Entonces vamos a utilizar
  1047. 45:19autentication token y vamos a ponerle
  1048. 45:21los detalles que entra dentro de los
  1049. 45:23detalles bueno utilizamos el objeto web
  1050. 45:25autentication de detail source para
  1051. 45:28especificar que este que los detalles
  1052. 45:31vienen Pues dentro de la dentro del
  1053. 45:34Records no dentro de la petición y
  1054. 45:36aparte de esto también lo que vamos a
  1055. 45:38hacer es actualizar el Security context
  1056. 45:40vamos a obtener el contexto y le vamos a
  1057. 45:43colocar la autenticación que en este
  1058. 45:45caso es del Jason webtop perdón es del
  1059. 45:49objeto autentication token que ya este
  1060. 45:51objeto Pues básicamente
  1061. 45:53va cargado con el con el token y con las
  1062. 45:58con los detalles del usuario y también
  1063. 45:59con los permisos que el usuario ya tiene
  1064. 46:01no Una vez que se ha hecho esto Pues
  1065. 46:03básicamente ya lo único que resta por
  1066. 46:06hacer es colocar el método filter
  1067. 46:08change.tu filter request response
  1068. 46:14perfecto ahora ahora como ustedes pueden
  1069. 46:18ver pues hemos creado nosotros nuestro
  1070. 46:20filtro de autenticación si vamos aquí
  1071. 46:22Bueno la lógica Todavía falta
  1072. 46:24implementar el Jason el jwt service pero
  1073. 46:28hasta este punto nosotros ya hemos
  1074. 46:30creado la lógica de lo que viene siendo
  1075. 46:32como trabajaría nuestro filtro de
  1076. 46:34autenticación One Spring
  1077. 46:36ok
  1078. 46:38perfecto
  1079. 46:46Ok Muy bien Entonces una vez que
  1080. 46:48nosotros Pues básicamente hemos creado
  1081. 46:50nuestra lógica de nuestro filtro como
  1082. 46:53tal Qué es lo que resta por hacer
  1083. 46:55regresamos un momento a nuestro diagrama
  1084. 46:58y como ustedes verán Pues básicamente ya
  1085. 47:00tenemos la parte del filtro el user de
  1086. 47:03tel service que nos va a traer
  1087. 47:04directamente el usuario para verificar
  1088. 47:06si existe o no existe Y qué es lo que
  1089. 47:09resta por hacer es el proceso de
  1090. 47:10validación de nuestro Jason web token
  1091. 47:13como tal Ok entonces si nosotros vamos a
  1092. 47:16nuestra clase del filtro ustedes verán
  1093. 47:18que aquí tengo Pues un servicio que yo
  1094. 47:20aún no he implementado en donde tenemos
  1095. 47:23un método que username y otro de validar
  1096. 47:26el token Ok entonces Pues básicamente
  1097. 47:28eso es lo que nosotros vamos a
  1098. 47:30implementar en este momento junto con
  1099. 47:33otros métodos dentro de esa clase que
  1100. 47:35servirán en el procesamiento de la
  1101. 47:37validación de nuestro Jason web
  1102. 47:40para ello Nos dirigimos a nuestra a
  1103. 47:42nuestro paquete de configuración y lo
  1104. 47:44que vamos a hacer es crear una clase que
  1105. 47:46se llame jbl Service
  1106. 47:49Ok y como su nombre mismo lo indica
  1107. 47:52vamos a colocar aquí la anotación
  1108. 47:54service para que el contenedor de Sprint
  1109. 47:57lo identifique como tal Ok entonces qué
  1110. 48:00es lo primero que nosotros vamos a
  1111. 48:02necesitar Aquí vamos a necesitar
  1112. 48:05un atributo estático y que sea privado y
  1113. 48:09final que se va a llamar
  1114. 48:12Secret key Ok Qué es la Secret key Bueno
  1115. 48:16es muy posible que ustedes hayan
  1116. 48:18escuchado Este término de Secret King
  1117. 48:20básicamente es una clave secreta en
  1118. 48:24español que sirve para firmar y
  1119. 48:26verificar que los tokens que nosotros
  1120. 48:28estamos generando no el que el jwt sea
  1121. 48:31auténtico ahora algo muy importante esta
  1122. 48:34cadena que yo estoy a punto de colocar
  1123. 48:36Aquí la estoy colocando en código con
  1124. 48:40fines prácticos Generalmente en un
  1125. 48:42entorno de producción dependiendo del
  1126. 48:45lugar en donde ustedes estén trabajando
  1127. 48:46pues no es recomendable colocar aquí en
  1128. 48:50código como tal yo simplemente lo estoy
  1129. 48:51poniendo en una forma de ejemplo
  1130. 48:54Entonces en ese caso pues dependiendo de
  1131. 48:57en donde ustedes estén trabajando va a
  1132. 48:58haber herramientas en donde se gestionen
  1133. 49:00este tipo de secrets Para mayor
  1134. 49:02protección de los datos y seguridad de
  1135. 49:04nuestra Api restword OK Pero yo por el
  1136. 49:08momento voy a colocarlo aquí ahora de
  1137. 49:10dónde voy a obtener esta Secret key
  1138. 49:12básicamente Pues hay varias herramientas
  1139. 49:14que nos permiten a nosotros pues
  1140. 49:16trabajar con con generadores no yo voy a
  1141. 49:20utilizar esta de aquí Ok esta me va a
  1142. 49:23generar una cadena de caracteres de 256
  1143. 49:26bytes bueno bits perdón y esta cadena de
  1144. 49:30caracteres Bueno yo la utilizo con 256
  1145. 49:33bits porque porque básicamente vamos a
  1146. 49:36trabajar con el algoritmo hs 256 si
  1147. 49:39nosotros este pues vamos a nuestra
  1148. 49:42página jwt punto io ustedes recordarán
  1149. 49:46que pues del Jason de ejemplo pues aquí
  1150. 49:48tiene una del tipo de algoritmo con el
  1151. 49:51que se está este generando este Jason
  1152. 49:54web token y como vamos a utilizar este
  1153. 49:56de aquí es recomendable utilizar una
  1154. 49:59cadena de caracteres de 256 bits Por
  1155. 50:01ende voy a utilizar esto Ok como pueden
  1156. 50:04ver pues aquí yo puedo ir regenerando
  1157. 50:05regenerando para tomar la que me parezca
  1158. 50:08conveniente Ok si ustedes desean Pues
  1159. 50:11voy a dejarles el link de esta
  1160. 50:13herramienta en la descripción y si no
  1161. 50:15pues pueden simplemente Buscar en Google
  1162. 50:17colocar Secret y generator y ahí pueden
  1163. 50:21encontrar un sinfín de herramientas que
  1164. 50:23pues les permitirá hacer esto Ok
  1165. 50:24entonces yo voy a copiar esta de aquí
  1166. 50:27específicamente muy bien regresamos a
  1167. 50:31nuestra a nuestro código y lo vamos a
  1168. 50:33colocar aquí perfecto ahora
  1169. 50:37Qué es lo primero que nosotros vamos a
  1170. 50:39realizar básicamente es bueno vamos a
  1171. 50:42nuestra a nuestro filtro y el primer
  1172. 50:44método que nosotros nos encontramos es
  1173. 50:46para eso como yo ya creé la clase vamos
  1174. 50:49a inyectarla en nuestro filtro Ok
  1175. 50:53seríate final
  1176. 50:54JW TT service
  1177. 50:58perfecto y vamos a crear el método
  1178. 51:01Entonces el primer método con el que nos
  1179. 51:04topamos es get user name y le vamos a
  1180. 51:06enviar el token como tal Así que vamos a
  1181. 51:08cambiarle el nombre de esto es un token
  1182. 51:10este método nos devuelve
  1183. 51:12[Música]
  1184. 51:14un String no Entonces qué es lo que
  1185. 51:16vamos a hacer a continuación vamos a
  1186. 51:18este crear un método genérico no Ok este
  1187. 51:24método lo voy a llamar
  1188. 51:28getclain vamos a llamarlo así get Klein
  1189. 51:32y le vamos a enviar el token Y también
  1190. 51:35vamos a utilizar
  1191. 51:37la clase cleans Ok y vamos a utilizar
  1192. 51:42el método Bueno no es una clase esto Más
  1193. 51:45bien es una interfase no que se va a
  1194. 51:47llamar get Ok general este método por en
  1195. 51:51general pues me sirve para obtener el
  1196. 51:53nombre del usuario del token que se está
  1197. 51:55enviando OK ahora esta clase como
  1198. 51:59ustedes pueden ver no existe como tal
  1199. 52:01porque porque me falta agregar ciertas
  1200. 52:03dependencias a la configuración de mi
  1201. 52:06aplicación Ok entonces vamos a
  1202. 52:09dirigirnos a nuestro archivo pom como
  1203. 52:11tal y vamos a bajar OK Vamos a colocarla
  1204. 52:14después de aquí de la dependencia del
  1205. 52:16longbook entonces la primera dependencia
  1206. 52:18que nosotros vamos a utilizar es la
  1207. 52:21dependencia De
  1208. 52:23jjwt Api ok
  1209. 52:26la siguiente que vamos a utilizar es
  1210. 52:29jjwt implementation o imprl y la última
  1211. 52:34que vamos a utilizar en este caso va a
  1212. 52:37ser
  1213. 52:37jjwt Jackson OK ahora ustedes se
  1214. 52:41preguntarán Para qué me sirve cada una
  1215. 52:43de estas dependencias básicamente la
  1216. 52:46primera
  1217. 52:47jjwtapi es una dependencia que contiene
  1218. 52:49interfaces para trabajar con Jason web
  1219. 52:51tokens como tal es decir nos proporciona
  1220. 52:53abstracciones no interfaces como tal la
  1221. 52:56jjwt implementation tiene las
  1222. 52:59implementaciones de las interfaces que
  1223. 53:02tiene
  1224. 53:03jjwtop es decir aquí ya está pues la
  1225. 53:05lógica detrás de estas interfaces y
  1226. 53:08finalmente tenemos una dependencia que
  1227. 53:10es JJ Jackson que básicamente es una
  1228. 53:14dependencia que se agrega para la
  1229. 53:16serialización y de esencialización de
  1230. 53:18Jason web tokens a Jason utilizando pues
  1231. 53:21la ya la famosa librería que gestiona
  1232. 53:24Jason de Spring ok Perfecto entonces una
  1233. 53:27vez que nosotros hemos agregado estas
  1234. 53:29dependencias vamos a hacer un Maiden
  1235. 53:31update Ok si ustedes recuerdan pues este
  1236. 53:34Cómo puedo obtener estas dependencias
  1237. 53:36podemos ir también al buscador
  1238. 53:39colocar por ejemplo jjlvente guión
  1239. 53:44repository y pues aquí ustedes van a
  1240. 53:46poder encontrar
  1241. 53:47la última versión de esa dependencia no
  1242. 53:50y así con todas las demás Entonces por
  1243. 53:52ese lado ningún problema ok Ya vamos a
  1244. 53:55de nuevo a nuestro proyecto ok Ya se han
  1245. 53:58sincronizado nuestras dependencias y
  1246. 54:00vamos de nuevo nuestro servicio entonces
  1247. 54:02en este caso van Bueno vamos a guardar
  1248. 54:04de nuevo vamos a colocar kleins como
  1249. 54:06pueden ver esta interfase ya está de io
  1250. 54:09punto Jason web token Ok y vamos a
  1251. 54:12utilizar
  1252. 54:13su método get socket como tal Ok que me
  1253. 54:16va a permitir Pues básicamente a mí en
  1254. 54:19esta interfase obtener pues
  1255. 54:22el subject no el en este caso el nombre
  1256. 54:25de usuario del jwbt que estamos enviando
  1257. 54:28Ok perfecto si ustedes son curiosos pues
  1258. 54:31ustedes ya Irán viendo qué más
  1259. 54:32características tiene esta clase Ok
  1260. 54:35entonces Bueno ahora vamos a crear este
  1261. 54:37método genérico Ok qué es lo que tenemos
  1262. 54:41Dentro de este método genérico Bueno
  1263. 54:43vamos a implementar lo siguiente OK
  1264. 54:46Vamos a crear aquí mismo vamos a poner
  1265. 54:48public que como es un método genérico
  1266. 54:50vamos a colocar el objeto t Ok y le
  1267. 54:54vamos a poner get Clean como tal para
  1268. 54:56que ahí esté la implementación Y vamos a
  1269. 54:59recibir pues como tal un String que es
  1270. 55:01el token Y también vamos a inyectar pues
  1271. 55:04una función ok En este caso va a ser una
  1272. 55:08función OK Vamos a colocar una función y
  1273. 55:11vamos a colocar aquí la interfaz clames
  1274. 55:15y vamos a colocar el objeto t Ok y vamos
  1275. 55:18a llamarle clanes
  1276. 55:20[Música]
  1277. 55:22entonces colocamos esto Aquí vamos a
  1278. 55:25importar la función Ok la interfaz de
  1279. 55:28función de los ítems de Java perfecto y
  1280. 55:32lo que vamos a hacer a continuación
  1281. 55:33Dentro de este método Ok va a ser
  1282. 55:36primero definir una variable final de
  1283. 55:39tipo cleans cleans y vamos a necesitar
  1284. 55:43aquí crear un método que se llame get
  1285. 55:46all planes Ok perfecto y este método va
  1286. 55:51a vamos a enviarle un toque Ok porque
  1287. 55:53vamos a tener que obtener todas las
  1288. 55:55reclamaciones del del token que nosotros
  1289. 55:58estamos enviando Entonces vamos a
  1290. 56:00retornar
  1291. 56:02clanes resourver punto Apple Ok
  1292. 56:05Recuerden que está esta clase yo lo
  1293. 56:07estoy pues bueno este método yo lo estoy
  1294. 56:09inyectando dentro de la función Ok y le
  1295. 56:12vamos a enviar los links que se
  1296. 56:13devolvieron de este método que quedó Ok
  1297. 56:17entonces vamos a crear este método de
  1298. 56:20Doll klains
  1299. 56:21perfecto que nos va a deformar devolver
  1300. 56:24Pues los clips como tal y vamos a
  1301. 56:27utilizar para esto OK Vamos a utilizar
  1302. 56:30este también una clase de io punto Jason
  1303. 56:33web token que se llama
  1304. 56:35jw.s Ok y esta básicamente Bueno vamos a
  1305. 56:40utilizar el método punto
  1306. 56:46y vamos a setear la clave de la firma Ok
  1307. 56:51entonces
  1308. 56:52qué es lo que vamos a hacer aquí adentro
  1309. 56:54Bueno vamos a obtener vamos a tener que
  1310. 56:57crear otro método que se llame obtener
  1311. 56:59la clave de la firma Ok getsing
  1312. 57:03que ya vamos a crear este Método en un
  1313. 57:06momento vamos a utilizar el
  1314. 57:09builds aclames Jason JW s Ok y vamos a
  1315. 57:15enviarle perfecto vamos a obtener el
  1316. 57:18body de esto Muy bien Entonces qué es lo
  1317. 57:20que tenemos que hacer nosotros aquí es
  1318. 57:22crear el método
  1319. 57:24muy bien
  1320. 57:26este Método en realidad no nos va a
  1321. 57:29devolver un by that right sino más bien
  1322. 57:30nos va a devolver un key Ok entonces
  1323. 57:33para ello qué es lo que vamos a hacer
  1324. 57:36vamos a este básicamente con este método
  1325. 57:40nosotros lo que vamos a hacer es
  1326. 57:43cómo cómo podríamos decirlo
  1327. 57:47vamos a tomar la clave secreta no o sea
  1328. 57:50es decir vamos a tomar esta clave aquí
  1329. 57:53que nosotros estamos utilizando Aquí
  1330. 57:54vamos a tomar esta clave secreta y vamos
  1331. 57:57este a convertirla en base 64 como tal
  1332. 58:01entonces para eso qué es lo que vamos a
  1333. 58:03hacer vamos a utilizar nosotros bueno
  1334. 58:06primero lo que vamos a hacer es crear un
  1335. 58:08objeto de tipo by the right okay
  1336. 58:10Bye
  1337. 58:12y vamos a ponerle cake de nombre y vamos
  1338. 58:16a utilizar la clase de colders Ok de
  1339. 58:20coders y vamos a tomar el secreto en
  1340. 58:23base
  1341. 58:2464.code y le vamos a colocar aquí la
  1342. 58:27Secret perfecto y lo que vamos a
  1343. 58:30retornar nosotros básicamente es
  1344. 58:35crean o sea vamos a crear y vamos a
  1345. 58:38retornar una firma H Mac utilizando una
  1346. 58:42clase de Java que se llama Case Ok esta
  1347. 58:46clase que me va a permitir a mí
  1348. 58:48básicamente hacer esta clase como digo
  1349. 58:51me va a permitir es crear una nueva
  1350. 58:53firma Perdón
  1351. 58:55hmac checky Ford Okay y Aquí vamos
  1352. 58:58nosotros a enviar los keytes que
  1353. 59:01Nosotros acabamos de crear
  1354. 59:02Perfecto entonces para recapitular qué
  1355. 59:06es lo que hice el método obtener usuario
  1356. 59:09Ok el método obtener nombre de usuario
  1357. 59:12utiliza el método obtener reclamación Ok
  1358. 59:15y le enviamos el token que nos están
  1359. 59:19enviando en el request Ok entonces
  1360. 59:21Nosotros le enviamos el token que le
  1361. 59:23enviamos en el recuento y estamos Este
  1362. 59:25inyectando el método get soject de la
  1363. 59:27interfase cleans para poder obtener el
  1364. 59:30subjet bueno en este caso el usuario del
  1365. 59:33token que nosotros estamos
  1366. 59:36mandando este método get Klein este toma
  1367. 59:40bueno crea un objeto de tipo cleans y
  1368. 59:43utiliza el método get klames enviándole
  1369. 59:46el token Ok este método quedó cleans
  1370. 59:48utiliza la clase Jason web token bueno
  1371. 59:52jw.ts y lo que hace básicamente este
  1372. 59:56este método es utilizar Pues de la la
  1373. 1:00:00firma no es decir Tomar la Secret key
  1374. 1:00:02decodificar en base 64 y crear una nueva
  1375. 1:00:06firma
  1376. 1:00:06hechiford Ok entonces una vez que
  1377. 1:00:09nosotros devolvemos la firma obtenemos
  1378. 1:00:13todos los clames Ok los clips del token
  1379. 1:00:15que nosotros estamos enviando retornamos
  1380. 1:00:18del claim Resort punto a Play Clean
  1381. 1:00:21cleans Ok y básicamente ya obtenemos el
  1382. 1:00:25nombre del usuario del token que
  1383. 1:00:27nosotros estamos enviando ok
  1384. 1:00:30perfecto Espero que se haya comprendido
  1385. 1:00:32un poco mejor esto ahora
  1386. 1:00:35que nos resta a nosotros por hacer
  1387. 1:00:38básicamente nosotros qué es lo que
  1388. 1:00:41nosotros
  1389. 1:00:43básicamente hacemos Bueno vamos a
  1390. 1:00:46retornar a nuestro filtro y ya
  1391. 1:00:49implementamos el proceso de obtener el
  1392. 1:00:50usuario Ok del Jason web token que nos
  1393. 1:00:52están enviando ahora lo que nosotros
  1394. 1:00:54tenemos que hacer es validar que
  1395. 1:00:57efectivamente ese token este sea
  1396. 1:01:00auténtico no Entonces vamos a crear ese
  1397. 1:01:03método que se llame validate top Ok
  1398. 1:01:07entonces para eso
  1399. 1:01:09creamos este validay token que es un
  1400. 1:01:12método de tipo booleano Ok aquí le vamos
  1401. 1:01:14a enviar el el Jason bueno en este caso
  1402. 1:01:17sería el token no el token que nos están
  1403. 1:01:19enviando en la petición y los user
  1404. 1:01:21details los detalles del usuario ok
  1405. 1:01:25Entonces qué es lo que vamos a hacer
  1406. 1:01:26aquí primero vamos a crear una un String
  1407. 1:01:30de tipo final Ok que se va a llamar
  1408. 1:01:32nombre de usuario Ok y vamos a Bueno
  1409. 1:01:36vamos a necesitar un método que se llame
  1410. 1:01:37get
  1411. 1:01:39el Ok Recuerden que ya ya creamos de ese
  1412. 1:01:43método Ok entonces enviamos el el que
  1413. 1:01:47recuerden es de este mismo de aquí
  1414. 1:01:48entonces necesito tomar el nombre de
  1415. 1:01:50usuario y lo que vamos a hacer a
  1416. 1:01:52continuación es retornar
  1417. 1:01:55Ok sería como y vamos a comparar esto y
  1418. 1:02:00cuál es con los user details que estamos
  1419. 1:02:04mandando en el proyecto Entonces vamos a
  1420. 1:02:07obtener el username del user details Ok
  1421. 1:02:10y tiene que ser igual al usuario que yo
  1422. 1:02:14estoy extrayendo del token Ok
  1423. 1:02:18perfecto y además aparte de eso
  1424. 1:02:22tenemos que
  1425. 1:02:25decirle a esto que si es el token no ha
  1426. 1:02:29expirado no O sea y toquen xpire
  1427. 1:02:33entonces para eso vamos a crear un
  1428. 1:02:34método que verifique que efectivamente
  1429. 1:02:36el token no no no no no ha expirado no O
  1430. 1:02:40sea que no ha pasado su periodo de
  1431. 1:02:43expiración y para eso lo que vamos a
  1432. 1:02:45hacer es crear este método de aquí que
  1433. 1:02:48se llame is token Entonces vamos a crear
  1434. 1:02:52este método que igual nos va a devolver
  1435. 1:02:54un booleano y básicamente este método
  1436. 1:02:56nos va a retornar
  1437. 1:02:58vamos a dejarlo así para mantener el
  1438. 1:03:01código más simple nos va a retornar el
  1439. 1:03:04resultado de otro método que se va a
  1440. 1:03:06llamar
  1441. 1:03:11OK enviamos el toque
  1442. 1:03:14punto pifore Ok y le vamos a enviar
  1443. 1:03:19New date OK Vamos a enviarle inyectarle
  1444. 1:03:23la la clase de tipo fecha de Java Ok
  1445. 1:03:27entonces vamos a crear este método que
  1446. 1:03:29despiration
  1447. 1:03:31Ok perfecto
  1448. 1:03:36Y qué es lo que va a retornar este
  1449. 1:03:38método que da expiration básicamente
  1450. 1:03:40vamos a utilizar la interfase cleans de
  1451. 1:03:43io punto Jason web token vamos a
  1452. 1:03:45retornar Ok xtrack Plane
  1453. 1:03:52no perdón no se llama strange se llama
  1454. 1:03:54get Clean Ok y le vamos a enviar el
  1455. 1:03:57token y le vamos a inyectar la interfase
  1456. 1:04:00get en este caso como pueden ver tenemos
  1457. 1:04:03get expiration justo aquí
  1458. 1:04:07Ok
  1459. 1:04:08perfecto punto y coma aquí y ya tenemos
  1460. 1:04:11acá también tenemos que agregar un punto
  1461. 1:04:13y coma Ok entonces como pueden ver esta
  1462. 1:04:16interfase Clean que yo pues estoy
  1463. 1:04:17utilizando es muy útil para obtener pues
  1464. 1:04:19varias varias este varias diferentes
  1465. 1:04:23tipo de información del token que me
  1466. 1:04:26están enviando como pueden ver por
  1467. 1:04:28ejemplo puedo obtener el nombre ok y el
  1468. 1:04:31usuario puede obtener la información
  1469. 1:04:33como la la expiration Ok puedo obtener
  1470. 1:04:37el ID Ok entonces son es varios tipos de
  1471. 1:04:41reclamaciones que yo puedo hacer
  1472. 1:04:42mediante esta interfase que me permite a
  1473. 1:04:45mí pues obtener cierto tipo de
  1474. 1:04:46información de Jason web token que se ha
  1475. 1:04:50generado para este efectivamente saber
  1476. 1:04:53si es que este Jason web token es válido
  1477. 1:04:56no Ok entonces bastante interesante esta
  1478. 1:04:59clase de tipo clems junto con su
  1479. 1:05:01implementación
  1480. 1:05:03Entonces como pueden ver efectivamente
  1481. 1:05:05pues ya hemos hecho la la implementación
  1482. 1:05:10de obtener el usuario y la validación de
  1483. 1:05:14el Jason webtock
  1484. 1:05:22Muy bien Entonces hasta este punto ya
  1485. 1:05:25hemos nosotros pues
  1486. 1:05:27configurado no que cuando se envía una
  1487. 1:05:30petición Pues básicamente
  1488. 1:05:33se Lance el one Quest filter que es
  1489. 1:05:36nuestro filtro de Jason web token y
  1490. 1:05:39también hemos de hecho el proceso de
  1491. 1:05:42validación de nuestro Jason web token no
  1492. 1:05:45Ok como podemos ver aquí hemos este
  1493. 1:05:48implementado el proceso de validación
  1494. 1:05:50por ejemplo también el de obtener el
  1495. 1:05:53usuario que pues como mencioné en un
  1496. 1:05:55inicio va a ser el email no el email va
  1497. 1:05:58a ser el que funcione como el usuario
  1498. 1:06:00para poderse autenticar a nuestra
  1499. 1:06:03aplicación ahora
  1500. 1:06:05algo muy importante no ya hemos hecho
  1501. 1:06:09pues del proceso de validar el token no
  1502. 1:06:12el token que nos esté enviando cualquier
  1503. 1:06:14cliente mediante una petición
  1504. 1:06:17pero también pues nuestra Api tiene que
  1505. 1:06:20generar esos tokens por sí misma OK Para
  1506. 1:06:23poder validar que sea Auténticos es
  1507. 1:06:25decir yo debo en mi Api implementar el
  1508. 1:06:30proceso de que pues entregarle un clic a
  1509. 1:06:33un cliente un token auténtico para que
  1510. 1:06:36éste pueda acceder a los recursos de
  1511. 1:06:39nuestra aplicación Entonces eso es lo
  1512. 1:06:42que vamos a implementar ahora en nuestro
  1513. 1:06:45servicio Ok entonces para eso lo que
  1514. 1:06:48vamos a hacer es generar ese toque Muy
  1515. 1:06:52bien Entonces vamos a crear un nuevo
  1516. 1:06:53método que lo vamos a llamar public
  1517. 1:06:56va a retornar un String que en este caso
  1518. 1:06:59va a ser el token Ok y le vamos a
  1519. 1:07:02colocar generate toque Ok perfecto
  1520. 1:07:08muy bien
  1521. 1:07:09Entonces qué es lo que vamos nosotros a
  1522. 1:07:12enviar este vamos a enviar un
  1523. 1:07:15map no un objeto map OK Por si este
  1524. 1:07:19tengo este
  1525. 1:07:22klains o reclamaciones extra No desde el
  1526. 1:07:25token Ok Ok en este caso vamos a
  1527. 1:07:28importar
  1528. 1:07:29la interfase de map de Los Beatles de
  1529. 1:07:32Java y vamos a ponerle aquí
  1530. 1:07:35clanes OK Por si tengo extra o pongamos
  1531. 1:07:39aquí clims Ok y vamos a enviarle los
  1532. 1:07:44detalles del usuario de Us okay
  1533. 1:07:48Perfecto entonces qué es lo que nosotros
  1534. 1:07:51vamos a hacer aquí Bueno vamos a
  1535. 1:07:53utilizar la misma clase que nosotros
  1536. 1:07:55utilizamos acá OK Para para para poder
  1537. 1:07:59obtener todas las reclamaciones del
  1538. 1:08:01Jason web token que nos están enviando
  1539. 1:08:03Pero esta vez para generar ese toque
  1540. 1:08:05Entonces vamos a hacer un bretón
  1541. 1:08:08jwts Ok punto y en este caso vamos a
  1542. 1:08:12utilizar builder OK el builder Recuerden
  1543. 1:08:16que esta clase pertenece Pues
  1544. 1:08:17básicamente alcor de de io punto Jason
  1545. 1:08:21web token Ok entonces vamos a utilizar
  1546. 1:08:23el builder Y en este caso vamos a setear
  1547. 1:08:27los clanes y vamos a
  1548. 1:08:31enviar los dextragames que pues se nos
  1549. 1:08:35están otorgando aquí no OK ahora vamos a
  1550. 1:08:39colocar el set sadget Y en este caso
  1551. 1:08:41pues vamos a mandarle el email no O sea
  1552. 1:08:44el email que nosotros estamos obteniendo
  1553. 1:08:46deltails Ok entonces vamos a poner que
  1554. 1:08:49en este caso get username OK Vamos a
  1555. 1:08:53colocarle el la fecha en la que se que
  1556. 1:08:58se genera el token no Entonces vamos a
  1557. 1:08:59poner el set at OK Vamos a colocar el
  1558. 1:09:03nuevo objeto de tipo date y vamos a
  1559. 1:09:06utilizar pues la
  1560. 1:09:10la hora y bueno la fecha básicamente de
  1561. 1:09:14en el instante en el que se genere el
  1562. 1:09:16token no Y también vamos a colocarle la
  1563. 1:09:19fecha de expiración de ese token
  1564. 1:09:21entonces vamos a también enviarle un
  1565. 1:09:24objeto de tipo date vamos a colocar
  1566. 1:09:27desde el momento en el que se genera Ok
  1567. 1:09:30y como estamos hablando de Pues de de
  1568. 1:09:34milisegundos tenemos que sumarle los
  1569. 1:09:371000 de esos milisegundos multiplicar
  1570. 1:09:39por 60 Ok y por 24 así que de esta forma
  1571. 1:09:44Estamos dándole un tiempo de expiración
  1572. 1:09:46a nuestro token Pues de 24 horas es
  1573. 1:09:49decir en 24 horas de este token ya
  1574. 1:09:51dejará de ser pálido y pues en caso de
  1575. 1:09:54que nos envíen el mismo token después de
  1576. 1:09:56esas 24 horas vamos a retornar un 403 Ok
  1577. 1:10:00perfecto y vamos a colocar
  1578. 1:10:04la firma no el algoritmo de firma que ya
  1579. 1:10:07he mencionado antes Ok entonces para eso
  1580. 1:10:11vamos a utilizar el método que creamos
  1581. 1:10:13get OK Para obtener decodificado Ok el
  1582. 1:10:18la Secret que nosotros enviamos
  1583. 1:10:20recuerden es de este método de aquí Ok y
  1584. 1:10:24aparte de eso vamos a mandarle el
  1585. 1:10:26algoritmo de la firma en este caso vamos
  1586. 1:10:29a utilizar como ya mencioné el hs 206
  1587. 1:10:34perfecto muy bien colocamos compact OK
  1588. 1:10:39Para que se haga todo esto un String Y
  1589. 1:10:42tenemos el método de generar toque Ahora
  1590. 1:10:45yo por el momento pues no no no no no no
  1591. 1:10:48quiero utilizar los extraclames Ok
  1592. 1:10:51simplemente quiero generar este token a
  1593. 1:10:54partir Pues de los user details Cómo se
  1594. 1:10:57hace esto Pues bueno lo que vamos a
  1595. 1:10:58hacer es crear una sobrecarga de este
  1596. 1:11:01método no vamos a ponerle publiques
  1597. 1:11:03[Música]
  1598. 1:11:05Ok y simplemente user le vamos a enviar
  1599. 1:11:11los
  1600. 1:11:14y vamos a invocar al método general
  1601. 1:11:18vamos a poner aquí return y vamos a
  1602. 1:11:20llamar al generate token que acabamos de
  1603. 1:11:22crear le vamos a enviar un nuevo
  1604. 1:11:26vacío okay sin clames y le vamos a
  1605. 1:11:29enviarlos yo soy
  1606. 1:11:32Perfecto entonces con esta
  1607. 1:11:35implementación ya podemos este empezar a
  1608. 1:11:38realizar lo que es pues del servicio de
  1609. 1:11:41autenticación Ok entonces
  1610. 1:11:44ya vamos a ver cómo se hace
  1611. 1:11:48perfecto Ok entonces nosotros podemos
  1612. 1:11:51generar Pues los métodos de valga la
  1613. 1:11:54redundancia generar el token no
  1614. 1:11:57entregarle un toque en el cliente Para
  1615. 1:11:58poder pues este permitirle que
  1616. 1:12:02acceda los recursos de nuestra
  1617. 1:12:04aplicación Ok entonces me gustaría mover
  1618. 1:12:07un momento al filtro OK Y si nos
  1619. 1:12:10dirigimos a esta parte de aquí cuando
  1620. 1:12:12nosotros pues bueno obtenemos el usuario
  1621. 1:12:14del Jason web token que en este caso se
  1622. 1:12:17envía en el request Ok entramos en la
  1623. 1:12:20validación de ver que exista el user
  1624. 1:12:22name dentro del token y que no haya
  1625. 1:12:24ninguna autenticación en el contexto de
  1626. 1:12:26la aplicación no una vez que nosotros
  1627. 1:12:28entramos dentro de esta validación
  1628. 1:12:32como ustedes recordarán estamos
  1629. 1:12:34utilizando la interfase de user detail
  1630. 1:12:36service OK Para poder cargar el usuario
  1631. 1:12:41por su nombre de usuario no que en este
  1632. 1:12:44caso pues va a ser el email no que
  1633. 1:12:47nosotros estamos enviando ahora si
  1634. 1:12:50retornamos un poco a nuestra gráfica
  1635. 1:12:52ustedes dirán bueno esta esta interfase
  1636. 1:12:55pues está
  1637. 1:12:56trayéndose directamente de la base de
  1638. 1:12:59datos como lo hace Cómo utiliza jpa
  1639. 1:13:01Bueno qué es lo que nos resta por hacer
  1640. 1:13:03básicamente lo que nosotros tenemos que
  1641. 1:13:05hacer es crear un Bing no un Bing en
  1642. 1:13:09donde nosotros podamos inyectar el
  1643. 1:13:11repositorio con este método que nosotros
  1644. 1:13:13creamos aquí que esto ya es jpa y poder
  1645. 1:13:16extraer ese usuario o en este caso ese
  1646. 1:13:19email Entonces cómo hacemos eso es muy
  1647. 1:13:22sencillo nosotros vamos a dirigirnos a
  1648. 1:13:25Pues a nuestro paquete de config y vamos
  1649. 1:13:27a crear una nueva clase que se llame
  1650. 1:13:30config OK Porque aquí vamos a definir
  1651. 1:13:33configuraciones de nuestra aplicación
  1652. 1:13:35aunque como es de nuestra aplicación me
  1653. 1:13:37gustaría llamarle app ok
  1654. 1:13:41perfecto ahora qué es lo que nosotros
  1655. 1:13:44vamos a definir aquí básicamente es
  1656. 1:13:48primero vamos a anotar esta clase con la
  1657. 1:13:51anotación de configuration para
  1658. 1:13:52indicarle el contenedor de Spring que
  1659. 1:13:54aquí van a ver configuraciones que deben
  1660. 1:13:56ser inicializadas la anotación del
  1661. 1:14:00longbook de recuerded arcos constructor
  1662. 1:14:02de
  1663. 1:14:03y lo que vamos a hacer primero Ok es
  1664. 1:14:07crear este un método
  1665. 1:14:09public que nos va a retornar un user
  1666. 1:14:13detail service OK
  1667. 1:14:17Y qué es lo que vamos a retornar OK
  1668. 1:14:19Vamos a retornar un New user detail
  1669. 1:14:23service y como pueden ver esto
  1670. 1:14:25automáticamente Pues me va a permitir a
  1671. 1:14:28mí
  1672. 1:14:30me va a sobrecargar pues del método del
  1673. 1:14:33user by user name que es el que nosotros
  1674. 1:14:35estamos utilizando exactamente aquí en
  1675. 1:14:39el filtro Ok entonces regresemos
  1676. 1:14:42perfecto qué es lo que vamos a hacer a
  1677. 1:14:46continuación Bueno sí como ven esto Se
  1678. 1:14:48generó automáticamente Y si yo este
  1679. 1:14:51pongo mi cursor encima de lo que estoy
  1680. 1:14:53retornando puedo reemplazarlo con lambda
  1681. 1:14:55para mantener Pues un código mucho más
  1682. 1:14:58legible no entonces démosle clic aquí y
  1683. 1:15:00como pueden ver aquí ya estoy utilizando
  1684. 1:15:03expresiones Landa ahora
  1685. 1:15:06voy a retornar el nombre del usuario
  1686. 1:15:09pero para eso necesito inyectar mis
  1687. 1:15:12repositorio Ok entonces vamos a
  1688. 1:15:15inyectarlo no private final
  1689. 1:15:17repository y su repositorio Ok y
  1690. 1:15:20exactamente Aquí vamos a utilizar ese
  1691. 1:15:23repositorio Ok user repositorio ponte
  1692. 1:15:26find punto find by email que es el
  1693. 1:15:31método que recordarán ustedes en el
  1694. 1:15:33repositorio lo definimos aquí Ok
  1695. 1:15:35entonces y le vamos a enviar en este
  1696. 1:15:38caso el user me perfecto ahora
  1697. 1:15:43Por qué me está dando error aquí porque
  1698. 1:15:45en este caso necesito este este método
  1699. 1:15:49puede fallar no Entonces en este caso
  1700. 1:15:52necesita retornar una excepción Ok
  1701. 1:15:56entonces vamos a colocarle orales Ok y
  1702. 1:15:59Dentro de este Igual vamos a usar
  1703. 1:16:01expresiones lambda y vamos a colocar
  1704. 1:16:04aquí
  1705. 1:16:07OK Vamos a colocar aquí que en caso de
  1706. 1:16:10que no le encuentre va a lanzar un user
  1707. 1:16:12name not Found exey excepción que es una
  1708. 1:16:15clase netamente de Spring Security que
  1709. 1:16:18pues es comúnmente usada de que el
  1710. 1:16:20usuario no se ha encontrado Entonces
  1711. 1:16:21vamos a arrojar esa excepción y vamos a
  1712. 1:16:25indicar que el usuario no ha sido
  1713. 1:16:29encontrado Okay perfecto
  1714. 1:16:33muy bien
  1715. 1:16:35Ok entonces bueno Vamos a darle un enter
  1716. 1:16:38aquí para mantener un poco más
  1717. 1:16:40legible el código Ok entonces aquí ya
  1718. 1:16:44estamos utilizando bueno no no lo
  1719. 1:16:46estamos utilizando un se ha definido el
  1720. 1:16:48servicio Ok que nosotros estamos este
  1721. 1:16:51sobrecargando en este caso pero para que
  1722. 1:16:55esto pueda ser inyectado es decir este
  1723. 1:16:58esto Esto puede hacer utilizado en el
  1724. 1:16:59contexto de toda nuestra aplicación y
  1725. 1:17:02específicamente en nuestro filtro
  1726. 1:17:05tenemos que definirlo como un Bing
  1727. 1:17:07entonces lo que resta por hacer es
  1728. 1:17:10colocarle la notación de Pin Ok Perfecto
  1729. 1:17:13entonces como ya es un Bing ya podemos
  1730. 1:17:15utilizarlo en el contexto de nuestra
  1731. 1:17:17aplicación y ahora sí este detail
  1732. 1:17:20service básicamente va a utilizar el by
  1733. 1:17:24user name
  1734. 1:17:26y va a utilizar nuestro repositorio para
  1735. 1:17:28poder encontrar ese usuario por su email
  1736. 1:17:31perfecto
  1737. 1:17:33muy
  1738. 1:17:35entonces continuemos con la
  1739. 1:17:37implementación
  1740. 1:17:40Perfecto entonces hasta este punto si
  1741. 1:17:43nosotros revisamos nuestro diagrama
  1742. 1:17:44ustedes van a ver que ya el proceso está
  1743. 1:17:48implementado No ya tenemos nuestro
  1744. 1:17:49filtro la validación el usery service se
  1745. 1:17:53actualiza el Security contex holder Ok
  1746. 1:17:56esto Pues si recuerdan aquí en el filtro
  1747. 1:17:58lo tenemos una vez que pues ya se hace
  1748. 1:18:00el filtrado se valida el token pues se
  1749. 1:18:04hace la actualización del contex holder
  1750. 1:18:06Ok
  1751. 1:18:07aquí
  1752. 1:18:09enviándole el token de autenticación y
  1753. 1:18:12se sigue el procesamiento del request
  1754. 1:18:15normalmente ahora qué es lo que resta
  1755. 1:18:18por hacer como ven ya tenemos
  1756. 1:18:20configurado el proceso pero
  1757. 1:18:23no lo estamos lanzando en ningún momento
  1758. 1:18:26Ok entonces aquí tenemos que hacer ya la
  1759. 1:18:30configuración de seguridad para que todo
  1760. 1:18:32este proceso de Spring Security con
  1761. 1:18:34Jason web token se vaya este realizando
  1762. 1:18:38cómo hacemos eso bueno lo que vamos a
  1763. 1:18:41hacer lo que vamos a hacer a
  1764. 1:18:43continuación básicamente va a ser crear
  1765. 1:18:46una nueva clase en config Ok esta la
  1766. 1:18:49vamos a llamar Security Ok Recuerden que
  1767. 1:18:53estamos tratando de seguir la estructura
  1768. 1:18:55más fiel posible a lo que ustedes pueden
  1769. 1:18:58encontrar no O sea el nombre de estas
  1770. 1:19:00clases pues puede ser similar al nombre
  1771. 1:19:02de clases que ustedes pueden encontrar
  1772. 1:19:04en proyectos que ustedes ya hayan
  1773. 1:19:07heredado no Ok entonces creamos esta
  1774. 1:19:09clase Security OK Y qué vamos a definir
  1775. 1:19:14bueno primero vamos a definirla con la
  1776. 1:19:16notación configuration igual para
  1777. 1:19:17indicar que aquí hay configuraciones y
  1778. 1:19:19vamos a utilizar esta anotación muy
  1779. 1:19:21importante de
  1780. 1:19:24de Spring Security que es enable web
  1781. 1:19:27Security Para qué me sirve enable web
  1782. 1:19:30Security básicamente
  1783. 1:19:32Esta bueno esta esta anotación es muy
  1784. 1:19:35importante porque esta anotación permite
  1785. 1:19:38definir y habilitar la seguridad a nivel
  1786. 1:19:42de métodos dentro de nuestra aplicación
  1787. 1:19:44no entonces Esta es muy importante
  1788. 1:19:46porque con esto nosotros ya estamos
  1789. 1:19:48habilitando seguridades dentro de
  1790. 1:19:50nuestra red como tal Ok perfecto una vez
  1791. 1:19:54entendido eso Bueno vamos a colocar la
  1792. 1:19:57anotación del lombo igual de required
  1793. 1:19:59arts constructor y vamos también a
  1794. 1:20:02colocar la anotación enable Security Ok
  1795. 1:20:05Aquí vamos a habilitar pues la seguridad
  1796. 1:20:08a nivel de métodos como tal ahora
  1797. 1:20:12aquí es en donde nosotros ya vamos este
  1798. 1:20:15a lanzar nuestro filtro de autenticación
  1799. 1:20:17de Jason webtoker para eso lo que
  1800. 1:20:20tenemos que hacer es inyectar Ok de una
  1801. 1:20:23vez vamos a inyectar nuestro
  1802. 1:20:25web token
  1803. 1:20:29filter OK Vamos a inyectarlo aquí y
  1804. 1:20:32vamos a ponerlo aquí en filter OK Y qué
  1805. 1:20:35es lo que vamos a hacer primero ustedes
  1806. 1:20:37tal vez ya si tienen algo de experiencia
  1807. 1:20:39con experiencia van a haber escuchado
  1808. 1:20:41algo llamado como Security filter change
  1809. 1:20:44que básicamente es una cadena de
  1810. 1:20:46seguridad en donde se van ejecutando
  1811. 1:20:48pues los pasos que nosotros ya
  1812. 1:20:50configuramos como el filtrado la
  1813. 1:20:52autenticación etcétera no Y también ya
  1814. 1:20:55aquí se definen pues la seguridad es que
  1815. 1:20:57nosotros le estamos dando a los a los
  1816. 1:20:59netpoints que nosotros tenemos entonces
  1817. 1:21:01para que funcione eso lo que tenemos que
  1818. 1:21:04hacer es crear un método OK Vamos a
  1819. 1:21:05colocar publics Security filter Chain ok
  1820. 1:21:10vamos a colocar aquí igual Security
  1821. 1:21:12filter Chain y bueno qué es lo que vamos
  1822. 1:21:14a inyectar aquí básicamente es este
  1823. 1:21:18objeto http Security Ok de Spring
  1824. 1:21:22Security
  1825. 1:21:25Perfecto entonces en base a este objeto
  1826. 1:21:28que se está inyectando aquí es lo que
  1827. 1:21:29nosotros vamos a trabajar entonces qué
  1828. 1:21:32es lo que vamos a hacer primero primero
  1829. 1:21:33vamos a colocar https security punto si
  1830. 1:21:37es de http Security y bueno con los
  1831. 1:21:42últimos lanzamientos los últimos
  1832. 1:21:43realices de Spring Security si ustedes
  1833. 1:21:46ya tienen algo de experiencia con las
  1834. 1:21:48versiones anteriores ustedes recordarán
  1835. 1:21:49que pues se coloca varios métodos de
  1836. 1:21:52este objeto Como por ejemplo
  1837. 1:21:54la otra raíz
  1838. 1:22:00pero esa forma de colocar el Security
  1839. 1:22:03filter change hoy en día está un poquito
  1840. 1:22:05de precada no más claro está de precada
  1841. 1:22:08como tal Y lo que está apuntando en los
  1842. 1:22:11últimos realices es hacerlo con
  1843. 1:22:13expresiones Ok entonces vamos a tratar
  1844. 1:22:17de utilizar esas expresiones lambda lo
  1845. 1:22:19que vamos a colocar es si es
  1846. 1:22:22y vamos a colocar aquí primero
  1847. 1:22:26Deshabilitar el si es OK ahora una vez
  1848. 1:22:31que nosotros deshabilitamos esto vamos a
  1849. 1:22:33colocar outtery auto Race http request
  1850. 1:22:37Ok esto que me va a permitir aquí es
  1851. 1:22:40donde yo voy a definir los redpoints de
  1852. 1:22:43mi aplicación getse
  1853. 1:22:46en los controladores Cuáles van a ser
  1854. 1:22:49públicos y cuáles van a necesitar
  1855. 1:22:51autenticación Ok entonces vamos a
  1856. 1:22:54colocar aquí
  1857. 1:22:56lo primero vamos a utilizar expresiones
  1858. 1:22:59Landa
  1859. 1:23:02y Aquí vamos a colocar un punto Aquí
  1860. 1:23:06está request matters OK entonces aquí
  1861. 1:23:09dentro de este método yo voy a definir
  1862. 1:23:11Ok puedo colocar aquí una cadena de
  1863. 1:23:15caracteres aquí se define qué en points
  1864. 1:23:18de mi aplicación van a ser públicos no
  1865. 1:23:20Por qué Porque aquí voy a colocar el
  1866. 1:23:22método cuando yo coloco el método permit
  1867. 1:23:25all básicamente estoy indicándole a
  1868. 1:23:28Spring Security que todos los en points
  1869. 1:23:32que yo tenga dentro de estos ricos Smash
  1870. 1:23:34no van a necesitar autenticación Al
  1871. 1:23:37momento de consumir Por qué ustedes
  1872. 1:23:39recordarán que vamos a hacer un flujo de
  1873. 1:23:40logueo Por ende nosotros vamos a
  1874. 1:23:42necesitar Pues un en Point que me
  1875. 1:23:45permita registrar usuarios y otro en
  1876. 1:23:47Point que me permita autenticarme dentro
  1877. 1:23:50de la aplicación para que me den el
  1878. 1:23:51token de acceso a mi sistema Ok entonces
  1879. 1:23:55esos en points no necesitan este es
  1880. 1:23:59autenticación tienen que ser abiertos
  1881. 1:24:01Pues de este más que nada a todo el
  1882. 1:24:04público no Entonces vamos a dejarlo aquí
  1883. 1:24:07con permitle ya luego vamos a crear esto
  1884. 1:24:09sed points que son conocidos Como lista
  1885. 1:24:11blanca no nos apresuramos entonces bueno
  1886. 1:24:14colocamos permit all y lo que vamos a
  1887. 1:24:16colocar aquí es también en mi request Ok
  1888. 1:24:19y aquí qué es lo que estamos indicando
  1889. 1:24:22básicamente que aparte de estos en
  1890. 1:24:26points que yo estoy colocando aquí
  1891. 1:24:26cualquier otra petición que yo realice
  1892. 1:24:29en el sistema para poder ser realizar la
  1893. 1:24:31performance de esa petición necesito
  1894. 1:24:34estar autenticado muy bien Ahora vamos a
  1895. 1:24:37ver cómo se va a administrar la sesión
  1896. 1:24:39Ok y Aquí vamos igual a utilizar este
  1897. 1:24:42expresiones Landa Ok entonces vamos a
  1898. 1:24:45colocar 15.6 creation
  1899. 1:24:48política de creación de sesiones y vamos
  1900. 1:24:51a decirle que es perfecto
  1901. 1:24:54una vez que nosotros indicamos esto
  1902. 1:24:56vamos a tener que inyectar un
  1903. 1:24:58autentication Provider un proveedor de
  1904. 1:25:01autenticación Ok entonces para eso qué
  1905. 1:25:04es lo que tenemos que hacer ahora lo que
  1906. 1:25:07tenemos que hacer es inyectar una
  1907. 1:25:09interfase después Security que se llama
  1908. 1:25:11authentication
  1909. 1:25:13Provider como tal autentification
  1910. 1:25:16Provider Y eso va a ser lo que nosotros
  1911. 1:25:18vamos a enviar aquí ahora porque este
  1912. 1:25:22Por qué me está apareciendo este error
  1913. 1:25:24básicamente porque esta interfase pues
  1914. 1:25:26no tiene ningún Bing configurado que yo
  1915. 1:25:28haya este pues previamente
  1916. 1:25:34customizado no Entonces para eso nos
  1917. 1:25:36vamos a ir a nuestra a la configuración
  1918. 1:25:40es de nuestra aplicación y vamos a crear
  1919. 1:25:42otro Bin en este caso va a ser un
  1920. 1:25:45autentification
  1921. 1:25:46Provider como tal Ok autentication
  1922. 1:25:49Provider perfecto y Aquí vamos a ir
  1923. 1:25:52colocando vamos a utilizar una Data
  1924. 1:25:55Access del mismo de la misma Api de
  1925. 1:25:58Spring Security Ok que es de
  1926. 1:26:00autentication Provider creamos el objeto
  1927. 1:26:03Volador
  1928. 1:26:06OK Y qué es lo que vamos a colocar aquí
  1929. 1:26:09primero vamos a indicarle el user detail
  1930. 1:26:14service que nosotros estamos utilizando
  1931. 1:26:16que en este caso es el de arriba no Y
  1932. 1:26:18eso es Service OK Y también vamos a
  1933. 1:26:21indicarle
  1934. 1:26:24también el tipo de codificador de claves
  1935. 1:26:27que nosotros vamos a colocar Recuerden
  1936. 1:26:29que nosotros vamos a necesitar
  1937. 1:26:33un bien en este caso que yo pueda este
  1938. 1:26:37que me permita a mí serializar las
  1939. 1:26:39claves de mi usuario
  1940. 1:26:42Al momento de registrarlo no recuerden
  1941. 1:26:45que no es seguro pues guardar las claves
  1942. 1:26:46en su formato original sino que más bien
  1943. 1:26:48hay que codificarlas y guardarlas en
  1944. 1:26:50base de datos encriptadas entonces Bueno
  1945. 1:26:52por el momento vamos a colocar un método
  1946. 1:26:54aquí que necesitaremos que se llama
  1947. 1:26:56password incoder Ok y vamos a retornar
  1948. 1:27:00ese proveedor de autenticación
  1949. 1:27:05perfecto
  1950. 1:27:09estoy retornando la interfaz no esta
  1951. 1:27:12necesito retornar el objeto que se creó
  1952. 1:27:16ahí Okay perfecto muy bien entonces
  1953. 1:27:19Bueno qué vamos a hacer Bueno de una vez
  1954. 1:27:21completemos esto y vamos a crear el
  1955. 1:27:23método de password encoder ok
  1956. 1:27:27y lo que vamos a hacer aquí es
  1957. 1:27:30simplemente retornar
  1958. 1:27:32una clase que se llama Back password
  1959. 1:27:36encoder Ok que es de Spring Security
  1960. 1:27:38mismo perfecto este va a ser el objeto
  1961. 1:27:42que nos va a permitir a nosotros
  1962. 1:27:44serializar bueno no serializar sino más
  1963. 1:27:46bien encriptar
  1964. 1:27:48las claves que nosotros estemos enviando
  1965. 1:27:50a registrar en nuestra base de datos
  1966. 1:27:53Okay ahora muy importante siempre
  1967. 1:27:55definirlo esto como bien para poder
  1968. 1:27:58utilizarlo en el contexto de nuestra
  1969. 1:28:00aplicación Ok perfecto
  1970. 1:28:04Bueno aquí se ha colocado
  1971. 1:28:06automáticamente private vamos a
  1972. 1:28:08reemplazarlo por public Ok porque pues
  1973. 1:28:10al ser un Big necesito utilizarlo en
  1974. 1:28:12toda mi aplicación Bueno no es que
  1975. 1:28:14necesite sino que así funciona entonces
  1976. 1:28:17retornamos a nuestro Security config Ok
  1977. 1:28:19ahí está el autentication Provider
  1978. 1:28:21desapareció el error y continuamos con
  1979. 1:28:23nuestra cadena de filtrado
  1980. 1:28:27Perfecto entonces continuamos y una vez
  1981. 1:28:30que nosotros definimos el proveedor de
  1982. 1:28:31autenticación que estamos utilizando
  1983. 1:28:33vamos a Añadir el filter before A qué se
  1984. 1:28:37refiere esto el filtro que se va a
  1985. 1:28:39ejecutar antes del proceso de
  1986. 1:28:41autenticación por eso se llama add
  1987. 1:28:44filter before Ok es decir este de aquí y
  1988. 1:28:48cómo vamos a inyectarlo Pues básicamente
  1989. 1:28:50Ya lo tenemos aquí es lo que nosotros
  1990. 1:28:52mismos configuramos Vamos a ponerle aquí
  1991. 1:28:56el filtro y también vamos a indicarle
  1992. 1:29:01que vamos a enviarle en el filtro el
  1993. 1:29:04usernameing password autentication
  1994. 1:29:06filter que igual es una clase propia de
  1995. 1:29:09Sprint Security perfecto ya tenemos
  1996. 1:29:13configurada nuestra
  1997. 1:29:16nuestra nuestra nuestra nuestra
  1998. 1:29:21nuestra nuestra cadena de filtrado y
  1999. 1:29:24bueno me está dando un error aquí porque
  2000. 1:29:25obviamente esto posiblemente puede
  2001. 1:29:27arriesgar un arrojar una excepción de
  2002. 1:29:29Tal vez usuario no encontrado una
  2003. 1:29:32excepción de autenticación cualquier
  2004. 1:29:34tipo de excepción eso debe ser
  2005. 1:29:35gestionado recuérdenlo bien ya lo vimos
  2006. 1:29:37en las fases pasadas Así que vamos a
  2007. 1:29:40Añadir la excepción a nuestra a la firma
  2008. 1:29:43de nuestro método perfecto
  2009. 1:29:45Ok Muy bien y lo que tenemos que
  2010. 1:29:48retornar en este en este en este Bing en
  2011. 1:29:51este caso sería ya nuestro objeto
  2012. 1:29:55http Security construir perfecto y aquí
  2013. 1:30:00tenemos ya nuestra cadena de seguridad
  2014. 1:30:02muy importante colocarla como bien
  2015. 1:30:05porque al menos Esta esta este bim tiene
  2016. 1:30:09que ser ejecutado en el contexto de toda
  2017. 1:30:11nuestra aplicación en el momento en el
  2018. 1:30:13que se realice cualquier petición a
  2019. 1:30:15nuestro servidor apirest o como ustedes
  2020. 1:30:18quieran considerarlo
  2021. 1:30:24muy bien Ok ahora ya tenemos definida
  2022. 1:30:29pues nuestra nuestra cadena de
  2023. 1:30:33de filtrado OK Que va a ser la
  2024. 1:30:36responsable de lanzar nuestro filtro
  2025. 1:30:38antes del proceso de autenticación
  2026. 1:30:41Entonces qué es lo que tenemos que hacer
  2027. 1:30:45ahora como mencioné vamos a necesitar
  2028. 1:30:49proveerle a nuestro cliente una Api
  2029. 1:30:52primero para poderse registrar en la
  2030. 1:30:54aplicación en este caso y segundo para
  2031. 1:30:57poderse
  2032. 1:30:59para poder autenticarse dentro de
  2033. 1:31:02nuestra aplicación y poder en este caso
  2034. 1:31:04acceder a las urls protegidas como puede
  2035. 1:31:08ser por ejemplo greating controller que
  2036. 1:31:10pues después de esta configuración ya va
  2037. 1:31:13a ser una URL protegida y que a
  2038. 1:31:15diferencia del inicio ya no nos va a
  2039. 1:31:17retornar sin autenticación el Hello from
  2040. 1:31:19apijacks Ok entonces cómo vamos a hacer
  2041. 1:31:23eso Bueno vamos a tener primero que
  2042. 1:31:24crear un nuevo controlador ok
  2043. 1:31:29vamos a crear un autentication
  2044. 1:31:32controller
  2045. 1:31:37autentication otorrisation control
  2046. 1:31:42out controller
  2047. 1:31:45out controller dejémoslo en out
  2048. 1:31:48controller OK ahora vamos a colocar las
  2049. 1:31:51siguientes anotaciones lo primero que
  2050. 1:31:52vamos a hacer es definirlo como un redes
  2051. 1:31:55controller Ok Nada nuevo Vamos a ponerle
  2052. 1:31:58un request mapping ok En este caso vamos
  2053. 1:32:00a como estábamos manejando el estándar
  2054. 1:32:03no teníamos Api greating en este caso
  2055. 1:32:05Vamos a ponerle
  2056. 1:32:08Vamos a ponerle Api
  2057. 1:32:14OK Sí out Y pues el recuerdo
  2058. 1:32:21perfecto ahora
  2059. 1:32:24vamos a tener que inyectar un servicio
  2060. 1:32:28pero primero vamos a definirlos en
  2061. 1:32:30points de una de una vez Ok entonces
  2062. 1:32:32vamos a ponerlo en public vamos a
  2063. 1:32:35utilizar en este caso response Ok que
  2064. 1:32:39pertenece Pues a Spring framework como
  2065. 1:32:42tal que es una entidad que nos permite
  2066. 1:32:45pues gestionar los las los resultados
  2067. 1:32:47http Ok como siempre pues en estos
  2068. 1:32:51cursos Vamos a aprender siempre cositas
  2069. 1:32:52nuevas que les pueden servir ya depende
  2070. 1:32:54de ustedes cómo utilizan las
  2071. 1:32:56herramientas que se les proporciona Ok
  2072. 1:32:58entonces vamos a tener que retornar
  2073. 1:33:03un un una una respuesta de autenticación
  2074. 1:33:08no Entonces tenemos que crear igual una
  2075. 1:33:11un modelo una deto como ustedes quieran
  2076. 1:33:13llamarlo Dentro de este dentro de esta
  2077. 1:33:16de esta petición Así que vamos a dejarle
  2078. 1:33:19el nombre por el momento por ahí y vamos
  2079. 1:33:21a decir que este es el método de
  2080. 1:33:22registro Okay
  2081. 1:33:24perfecto entonces cuando yo quiero
  2082. 1:33:27registrar qué es lo que voy a recibir
  2083. 1:33:30como petición obviamente voy a recibir
  2084. 1:33:33la
  2085. 1:33:36la en este caso voy a recibir
  2086. 1:33:39el modelo de de registro no como tal
  2087. 1:33:44Okay entonces para eso vamos a colocar
  2088. 1:33:47aquí la anotación request
  2089. 1:33:50request Body Ok me van a enviar en la
  2090. 1:33:53petición
  2091. 1:33:56un objeto tipo register request
  2092. 1:34:00vamos a llamarle así sí vamos ese va a
  2093. 1:34:04ser el nombre del modelo y vamos a
  2094. 1:34:06ponerle request como tal Ok esto ya lo
  2095. 1:34:08vamos a ir creando paulatinamente Y qué
  2096. 1:34:10es lo que vamos a retornar en este caso
  2097. 1:34:12sería un response entity OK indicando
  2098. 1:34:15que todo fue un Ok Ok como un estatus Ok
  2099. 1:34:18y vamos a tener que en este caso
  2100. 1:34:21inyectar un servicio en donde yo
  2101. 1:34:24configure la autenticación es decir en
  2102. 1:34:27donde se realiza el proceso de
  2103. 1:34:29registrado o el proceso de autenticación
  2104. 1:34:32Así que vamos a indicarle que en este
  2105. 1:34:34caso sería una especie de out service OK
  2106. 1:34:39Y que debe tener un método igual que se
  2107. 1:34:41llama register en donde vamos a enviarle
  2108. 1:34:44pues la petición como tal Ok Perfecto
  2109. 1:34:48entonces este en Point lo vamos a
  2110. 1:34:51colocar como post mapping ok
  2111. 1:34:54va a ser un post porque obviamente estoy
  2112. 1:34:56enviando un cuerpo en la petición y va a
  2113. 1:34:59tener el en Point de register Ok y De
  2114. 1:35:03igual forma vamos a necesitar
  2115. 1:35:05uno para autenticación Ok entonces vamos
  2116. 1:35:08a llamarle auténtica Kate
  2117. 1:35:12autenticate igual nos va a devolver una
  2118. 1:35:15response de autenticación en este caso
  2119. 1:35:17no se va a llamar register en este caso
  2120. 1:35:19se va a llamar igual autenticate y no
  2121. 1:35:22vamos a recibir un
  2122. 1:35:25registro sino que más bien Vamos a
  2123. 1:35:28recibir una petición de autenticación
  2124. 1:35:30Entonces vamos a crear ese
  2125. 1:35:33ese modelo como tal también Ok entonces
  2126. 1:35:37colocamos aquí request perfecto
  2127. 1:35:41y en el out service va a haber un método
  2128. 1:35:44llamado authenticate
  2129. 1:35:46en donde va a ir igual el rico es que
  2130. 1:35:48estamos mandando perfecto
  2131. 1:35:51muy bien entonces por el momento tenemos
  2132. 1:35:53nuestro controlador Ok hemos creado dos
  2133. 1:35:56en points uno para registrarse otro para
  2134. 1:35:58autenticarse Y qué es lo que tenemos que
  2135. 1:36:00hacer ahora primero vamos a tener que
  2136. 1:36:03crear el los modelos no entonces bueno
  2137. 1:36:06para tener ordenado nuestro trabajo
  2138. 1:36:08vamos a crear Dentro de este paquete
  2139. 1:36:10otro paquete que lo vamos a llamar
  2140. 1:36:12models OK y dentro de esta de estos
  2141. 1:36:15models vamos a crear una clase que se
  2142. 1:36:18llame
  2143. 1:36:20autentication request
  2144. 1:36:27autentication request
  2145. 1:36:30que es la que tenemos aquí
  2146. 1:36:32vamos a igual a crear otra clase que se
  2147. 1:36:36llame register request
  2148. 1:36:42perfecto Muy bien Entonces ahora sí que
  2149. 1:36:45ya tenemos esto por lo menos vamos a
  2150. 1:36:47quitar estos errores sin importar la
  2151. 1:36:49clase y vamos a importar la clase
  2152. 1:36:50perfecto
  2153. 1:36:53y nos falta el out response Ok entonces
  2154. 1:36:56vamos a crear una clase que se llama
  2155. 1:36:58igual
  2156. 1:37:01out response
  2157. 1:37:06perfecto De igual forma vamos a
  2158. 1:37:08importarla ahí no Uy uy uy uy uy uy
  2159. 1:37:11response si se llama así al responder
  2160. 1:37:20models Ok veamos
  2161. 1:37:28out
  2162. 1:37:30response OK Me faltó la s aquí Me faltó
  2163. 1:37:35la s acá
  2164. 1:37:37Perfecto entonces vamos ahora sí importa
  2165. 1:37:40las clases y ya lo atendemos Muy bien
  2166. 1:37:43Entonces qué estructura van a tener esto
  2167. 1:37:45bueno en la petición de autenticación
  2168. 1:37:48básicamente va a recibir el email y la
  2169. 1:37:52clave no Entonces vamos a colocar aquí
  2170. 1:37:54por private String email Ok y private
  2171. 1:37:59String password Ok para poderse
  2172. 1:38:03autenticar pues es como un login no me
  2173. 1:38:05vas a mandar tu usuario y tu contraseña
  2174. 1:38:06en este caso el usuario es el email OK
  2175. 1:38:09Vamos a colocar las anotaciones Data
  2176. 1:38:11vamos a colocar el patrón builder como
  2177. 1:38:14siempre el norx constructor y el all
  2178. 1:38:19arts constructor perfecto
  2179. 1:38:21ahora la petición de registro qué es lo
  2180. 1:38:26que va a tener bueno Generalmente pues
  2181. 1:38:28obviamente me tiene que mandar la mayor
  2182. 1:38:29cantidad de datos que que solicita la
  2183. 1:38:33entidad no que en este caso es usuario
  2184. 1:38:36bueno el ID no me lo pide se genera
  2185. 1:38:38automáticamente así que pues van a ser
  2186. 1:38:41el primer nombre el segundo nombre el
  2187. 1:38:43email la clave y el rol Tampoco porque
  2188. 1:38:46vamos a hacer que se asigne
  2189. 1:38:48automáticamente el rol
  2190. 1:38:50Ok entonces vamos a ir al registro vamos
  2191. 1:38:54a colocar estos
  2192. 1:38:56atributos de aquí perfecto muy bien y De
  2193. 1:38:59igual forma las mismas anotaciones del
  2194. 1:39:02autentication request Ok Recuerden que
  2195. 1:39:04esto está funcionando como dt o models
  2196. 1:39:06como ustedes quieran llamarle pues para
  2197. 1:39:08mantener una mayor efectividad en la
  2198. 1:39:11gestión de datos Okay muy bien y qué es
  2199. 1:39:15lo que vamos a responder básicamente
  2200. 1:39:16Pues nosotros vamos a responder con el
  2201. 1:39:19token no una vez que te registras te voy
  2202. 1:39:22a devolver un token Y si te autenticas
  2203. 1:39:24igual te voy a devolver el token que
  2204. 1:39:26pues nuestra misma Api está generando y
  2205. 1:39:29De igual forma Aquí vamos a colocar las
  2206. 1:39:32anotaciones de una dto que en este caso
  2207. 1:39:36sería Data perfecto
  2208. 1:39:40OK Así que ya estamos preparados con
  2209. 1:39:44nuestras modelos con nuestro controlador
  2210. 1:39:48lo que resta por hacer es hacer la
  2211. 1:39:51implementación de el servicio de
  2212. 1:39:54autenticación
  2213. 1:40:01Perfecto entonces ya estamos listos con
  2214. 1:40:03nuestros controladores para registro y
  2215. 1:40:05autenticación de nuestro sistema qué es
  2216. 1:40:09lo que vamos a hacer a continuación
  2217. 1:40:11Bueno vamos a crear el servicio de
  2218. 1:40:13autenticación Bueno me estoy dando
  2219. 1:40:15cuenta que pues no cree como tal un
  2220. 1:40:18paquete de servicio y de hecho pues
  2221. 1:40:21en esta clase de aquí debería haber
  2222. 1:40:24sido colocada en ese paquete Pero bueno
  2223. 1:40:27no la vamos a tocar vamos a dejarla ahí
  2224. 1:40:29y ahora sí voy a crear ese paquete de
  2225. 1:40:32Service
  2226. 1:40:34y vamos a crear una interfase Ok que en
  2227. 1:40:38este caso sería
  2228. 1:40:42en este caso sería
  2229. 1:40:45out service Me parece que así fue que se
  2230. 1:40:49le colocó a ver
  2231. 1:40:51[Música]
  2232. 1:40:53porque una clase en donde vamos a
  2233. 1:40:55definir Pues en este caso qué es lo que
  2234. 1:40:57vamos a hacer vamos a necesitar un
  2235. 1:40:59método que sea public out
  2236. 1:41:03autentification como out response
  2237. 1:41:08síster Ok que va a recibir un registro
  2238. 1:41:17Ok y vamos a tener igual un Bueno aquí
  2239. 1:41:21no sería público Ok y vamos a igual un
  2240. 1:41:25out response
  2241. 1:41:27pero en este caso
  2242. 1:41:35en este caso va a ser de
  2243. 1:41:45Vamos a continuar sería en este caso de
  2244. 1:41:48autenticate
  2245. 1:41:52y no voy a recibir un registro
  2246. 1:41:55indication request perfecto ya ahora
  2247. 1:42:00bien qué es lo que vamos a hacer pues
  2248. 1:42:02vamos a inyectar esa
  2249. 1:42:05en este caso Esa esa interfase no que se
  2250. 1:42:08va a llamar
  2251. 1:42:09private out
  2252. 1:42:15service out service y listo hemos
  2253. 1:42:19inyectado ese servicio como tal OK Vamos
  2254. 1:42:22a colocarlo aquí el auto whited que
  2255. 1:42:25hemos venido utilizando
  2256. 1:42:32Ok y es porque porque no hay esos bings
  2257. 1:42:35porque tenemos que crear nuestra clase
  2258. 1:42:37de implementación que en este caso de
  2259. 1:42:40out service implementation Ok perfecto
  2260. 1:42:44vamos a anotar aquí con service como tal
  2261. 1:42:47Ok y pues acuérdense que nosotros
  2262. 1:42:52hacemos la implementación de la interfaz
  2263. 1:42:55Ok implemento implementamos los métodos
  2264. 1:42:58aquí tenemos sobrecargados ambos métodos
  2265. 1:43:01como tal Y pues se soluciona el problema
  2266. 1:43:04ese Ahora sí empezamos con la
  2267. 1:43:06implementación de esta lógica no Ok
  2268. 1:43:10Perfecto entonces empecemos primero por
  2269. 1:43:14inyectar el repositorio de nuestro
  2270. 1:43:16usuario Ok entonces vamos a hacer lo
  2271. 1:43:19siguiente
  2272. 1:43:23repository Ok y yo soy repository en
  2273. 1:43:26este caso como no estoy haciendo uso de
  2274. 1:43:28la natación vamos a colocar igual
  2275. 1:43:30required
  2276. 1:43:33arts constructor y así nos libramos de
  2277. 1:43:35esos problemas OK Y qué es lo que vamos
  2278. 1:43:38a hacer
  2279. 1:43:40Dentro de este método vamos a colocar
  2280. 1:43:42aquí
  2281. 1:43:44bar usuario va a ser igual a usuario
  2282. 1:43:47punto builder OK Vamos igual First name
  2283. 1:43:52request punto get First name muy bien
  2284. 1:43:56punto
  2285. 1:44:01vamos a colocar el email Ok email
  2286. 1:44:05request punto Gmail Ok y aquí viene algo
  2287. 1:44:09que ya hicimos que es el password como
  2288. 1:44:13mencioné el password jamás debe
  2289. 1:44:15guardarse Pues en sus caracteres
  2290. 1:44:17originales en base de datos si ustedes
  2291. 1:44:20recuerdan Pues nosotros aquí en el up
  2292. 1:44:22config definimos este Bing como tal
  2293. 1:44:24password encoder Entonces vamos a
  2294. 1:44:27inyectar este Bin dentro de la
  2295. 1:44:29implementación de nuestro servicio
  2296. 1:44:31sería private final igual password
  2297. 1:44:35encoder Ok password encoder y vamos a
  2298. 1:44:39colocarlo Aquí vamos a utilizar password
  2299. 1:44:41encoder punto codificar y vamos a enviar
  2300. 1:44:44nuestra clave ok get password perfecto
  2301. 1:44:47el rol como dije Vamos a ponerlo
  2302. 1:44:50nosotros por defecto esto ya depende de
  2303. 1:44:52los requerimientos de la aplicación de
  2304. 1:44:54ustedes pues ya verán Cómo adaptan la
  2305. 1:44:58lógica de esta implementación Pues a su
  2306. 1:45:00sistema Pero vamos a colocarlo en este
  2307. 1:45:03caso por defecto como un usuario no y
  2308. 1:45:06vamos finalmente a hacer buil de este
  2309. 1:45:08objeto muy bien
  2310. 1:45:10Vamos a guardar este usuario
  2311. 1:45:13y punto
  2312. 1:45:17y enviamos el user
  2313. 1:45:19muy bien guardamos el usuario
  2314. 1:45:22y vamos a generar el token recuerden yo
  2315. 1:45:26hago un registro y cuando me registro
  2316. 1:45:27pues obviamente le devuelvo un token a
  2317. 1:45:29ese a ese usuario para que pueda acceder
  2318. 1:45:32a los recursos no Entonces vamos a igual
  2319. 1:45:35utilizar
  2320. 1:45:36jwt
  2321. 1:45:39token OK y vamos a para generar el el
  2322. 1:45:44Jason web token que vamos a necesitar
  2323. 1:45:47Bueno pues vamos a utilizar nuestro
  2324. 1:45:50servicio de
  2325. 1:45:51Jason web token para poder generar el
  2326. 1:45:55token como tal OK Vamos a utilizar este
  2327. 1:45:57método de aquí Entonces vamos a colocar
  2328. 1:46:00aquí
  2329. 1:46:02bueno primero vamos a inyectar como tal
  2330. 1:46:04ese ese
  2331. 1:46:06servicio no private final Igual vamos a
  2332. 1:46:10colocar un jbl service
  2333. 1:46:14perfecto y aquí sí vamos a utilizar
  2334. 1:46:19toque no vamos a utilizar el del sino
  2335. 1:46:22siempre a base del
  2336. 1:46:25y le mandamos el usuario perfecto Por
  2337. 1:46:28qué este usuario porque este objeto
  2338. 1:46:29usuario pues puede hacerlo porque si
  2339. 1:46:32recuerdan pues la entidad está
  2340. 1:46:33implementando user deateles muy bien
  2341. 1:46:36entonces regresamos a nuestra
  2342. 1:46:38implementación
  2343. 1:46:39generamos el token y vamos a retornar
  2344. 1:46:42nuestra autentication
  2345. 1:46:45Ah No perdón era out response
  2346. 1:46:49OK Vamos a colocar punto builder Ok y
  2347. 1:46:53vamos a ponerle el token en este caso va
  2348. 1:46:57a ser el jw punto
  2349. 1:47:01perfecto ya hemos acabado con el proceso
  2350. 1:47:03de registro para recapitular que estamos
  2351. 1:47:06haciendo básicamente
  2352. 1:47:08creamos nuestro objeto usuario guardamos
  2353. 1:47:11la clave guardamos su rol Ok la clave
  2354. 1:47:15está haciendo encriptada utilizamos el
  2355. 1:47:17repositorio que estamos inyectando como
  2356. 1:47:19tal Ok y después pues simplemente lo que
  2357. 1:47:22estamos haciendo es
  2358. 1:47:24utilizar nuestro nuestro servicio de
  2359. 1:47:27Jason web token para generar el token
  2360. 1:47:30después del registro del usuario Ok y le
  2361. 1:47:33devolvemos ese token a nuestro cliente
  2362. 1:47:34perfecto
  2363. 1:47:37ahora lo que vamos a hacer es el proceso
  2364. 1:47:40de autenticación
  2365. 1:47:45muy bien Ok entonces ya hemos bueno
  2366. 1:47:51configurado Bueno no pero programado la
  2367. 1:47:54implementación del método en nuestro en
  2368. 1:47:59nuestro servicio de out service Ok
  2369. 1:48:01entonces ahora vamos a programar la
  2370. 1:48:05parte de autenticación de nuestro
  2371. 1:48:07usuario Ok entonces para eso lo que
  2372. 1:48:10vamos a hacer es lo siguiente primero
  2373. 1:48:12vamos a tener que inyectar Ok inyectar
  2374. 1:48:15una interfase de Sprint Security
  2375. 1:48:17conocida como authentication manager
  2376. 1:48:20para eso vamos a hacerlo entonces sería
  2377. 1:48:22Okay minúsculas private final
  2378. 1:48:26autentification
  2379. 1:48:28manager Ok y le vamos a colocar aquí
  2380. 1:48:31como autentification manager perfecto
  2381. 1:48:33ahora por qué me asomo este error pues
  2382. 1:48:35efectivamente lo que tenemos que hacer
  2383. 1:48:38es ir a nuestra clase de configuraciones
  2384. 1:48:40y crear ese bim como tal Ok entonces
  2385. 1:48:43vamos a hacerlo vamos a public
  2386. 1:48:47autentication manager Ok
  2387. 1:48:50autentication manager y vamos aquí a
  2388. 1:48:53colocar Bueno a inyectar no la clase
  2389. 1:48:56autentication
  2390. 1:48:58configuration como tal colocamos Aquí
  2391. 1:49:01vamos a dejarlo en conflict Ok perfecto
  2392. 1:49:04y qué es lo que vamos a retornar Bueno
  2393. 1:49:06vamos a utilizar config punto get
  2394. 1:49:09authentication manager perfecto
  2395. 1:49:12básicamente pues es una es una
  2396. 1:49:17una una clase que nos permite a nosotros
  2397. 1:49:20gestionar la autenticación mediante las
  2398. 1:49:23credenciales que nosotros le enviemos
  2399. 1:49:25como request para poder autenticarnos es
  2400. 1:49:28decir enviamos el usuario el password y
  2401. 1:49:30nos autenticamos antes lo que queríamos
  2402. 1:49:32hacer era registrarnos ahora lo que
  2403. 1:49:34queremos hacer es autenticar ahora
  2404. 1:49:36porque me asomé el error porque falta
  2405. 1:49:37agregar excepcional a la firma de
  2406. 1:49:40nuestro método que entonces agregamos el
  2407. 1:49:42exception Y como siempre colocamos esto
  2408. 1:49:45como un Bin para poderlo usar en el
  2409. 1:49:47contexto de nuestra aplicación
  2410. 1:49:48regresamos a nuestra implementación Y lo
  2411. 1:49:51que vamos a hacer es lo siguiente como
  2412. 1:49:54tal vamos a
  2413. 1:49:57a vamos a realizar la autenticación
  2414. 1:50:02utilizando la interfase que Nosotros
  2415. 1:50:04acabamos de colocar como un bi entonces
  2416. 1:50:06utilizamos el autentication manager Ok
  2417. 1:50:10punto autenticate OK Y qué es lo que
  2418. 1:50:14vamos a mandar aquí en autenticate un
  2419. 1:50:15nuevo objeto name password autentication
  2420. 1:50:19token y Aquí vamos a colocar el request
  2421. 1:50:23punto Ok get email y el request punto
  2422. 1:50:27get password Ok perfecto
  2423. 1:50:30listo Una vez que se ha realizado la
  2424. 1:50:33autenticación lo que vamos a hacer es
  2425. 1:50:35encontrar este usuario por su email
  2426. 1:50:37Entonces vamos a colocar igualla y usar
  2427. 1:50:41repository punto find user by email Ok
  2428. 1:50:45request punto get email punto punto Y si
  2429. 1:50:51no pues va a lanzar una excepción OK
  2430. 1:50:54ahora ustedes me dirán bueno por ahí
  2431. 1:50:57puede haber una especie de confusión no
  2432. 1:50:59porque estoy buscando el email en la
  2433. 1:51:02base de datos otra vez Bueno aquí lo que
  2434. 1:51:04estoy haciendo es autenticar Ok si se
  2435. 1:51:08autentica quiere decir que el Jason web
  2436. 1:51:10token fue correcto Y ahora yo voy a
  2437. 1:51:12tomar ese email Ok y lo estoy tomando
  2438. 1:51:15directamente de base de datos a ver si
  2439. 1:51:17es que lo encuentro para construir el
  2440. 1:51:20token para poderle dar permisos al
  2441. 1:51:24cliente que acaba de enviar la petición
  2442. 1:51:26ok No es para nada seguro el mismo
  2443. 1:51:28email de la petición para poder
  2444. 1:51:30construir el token es mucho mejor
  2445. 1:51:32el email del usuario directamente de la
  2446. 1:51:36base de datos después de que este se
  2447. 1:51:38haya autenticado entonces obviamente
  2448. 1:51:40tenemos que encontrar una coincidencia
  2449. 1:51:42entre el email que están enviando con el
  2450. 1:51:45que se encuentra en la base de datos
  2451. 1:51:46Recuerden que estamos utilizando el
  2452. 1:51:48email como el nombre de usuario o como
  2453. 1:51:49un identificador único de este usuario
  2454. 1:51:52en la base de datos Ok Perfecto entonces
  2455. 1:51:55como ya en teoría hasta este punto se
  2456. 1:51:58encuentra el usuario lo que vamos a
  2457. 1:52:00hacer es un construir nuestro Jason web
  2458. 1:52:03token Ok para poderle dar acceso a
  2459. 1:52:06nuestra aplicación cliente Así que vamos
  2460. 1:52:08a utilizar nuestro servicio y vamos a
  2461. 1:52:11generar el token OK Y qué es lo que
  2462. 1:52:13vamos a enviar el usuario perfecto
  2463. 1:52:16muy bien Ahora sí vamos a retornar Ok
  2464. 1:52:21nuestro autentication
  2465. 1:52:24response Así fue como le colocamos no
  2466. 1:52:28era out response
  2467. 1:52:31Ok punto builder punto token y le
  2468. 1:52:36enviamos nuestro toque Ok y construimos
  2469. 1:52:39el objeto y ya se está retornando OK
  2470. 1:52:42borramos este que está de más perfecto y
  2471. 1:52:45ya tenemos nuestro servicio de registro
  2472. 1:52:48y autenticación de usuarios como tal
  2473. 1:52:56perfecto muchachos ya estamos llegando a
  2474. 1:52:59la parte final Ok de esta fase del curso
  2475. 1:53:03ya esto prácticamente está listo para
  2476. 1:53:06probarse Pero si ustedes recuerdan yo
  2477. 1:53:09mencioné algo de unas whites no O
  2478. 1:53:11También conocido como listas blancas a
  2479. 1:53:14qué me refiero con listas blancas no son
  2480. 1:53:16más que los den points que se pueden
  2481. 1:53:17exponer a cualquier usuario sin
  2482. 1:53:20necesidad de ser autenticado y
  2483. 1:53:21autorizado dentro de la aplicación Ok
  2484. 1:53:24entonces me gustaría realizar primero
  2485. 1:53:27esa lista blanca y para ello voy a ir al
  2486. 1:53:30controlador de grating Ok si ustedes
  2487. 1:53:32recuerdan Este es el primer el primer en
  2488. 1:53:34Point que nosotros creamos y me gustaría
  2489. 1:53:37evidenciar ya el funcionamiento de
  2490. 1:53:39Sprint Security como tal no Entonces
  2491. 1:53:41vamos a crear otro en Point pero que se
  2492. 1:53:44va a llamarse Hello protect Ok haciendo
  2493. 1:53:47referencia a que este en Point está
  2494. 1:53:49protegido por Spring Security y este
  2495. 1:53:51quiero exponerlo pues a todo a todo tipo
  2496. 1:53:54de usuario no y vamos voy a colocar aquí
  2497. 1:53:57un mensaje de Hello from jacks protected
  2498. 1:53:59perfecto vamos a cambiar el nombre del
  2499. 1:54:01método protector muy bien listo en
  2500. 1:54:05esencia tienen el mismo funcionamiento
  2501. 1:54:07vamos a guardar esto y también vamos a
  2502. 1:54:09ir a nuestra clase de Security config Ok
  2503. 1:54:13y vamos a crear nosotros esta llamada
  2504. 1:54:15lista Blanca entonces para eso Bueno lo
  2505. 1:54:20que yo comúnmente utilizo hay diferentes
  2506. 1:54:22formas de crear esta lista yo lo que voy
  2507. 1:54:23a hacer es crear un método privado Ok
  2508. 1:54:26request que se que me traiga un rico
  2509. 1:54:28smatcher Ok y esto lo voy a llamar como
  2510. 1:54:32public en points o en points públicos o
  2511. 1:54:36como ustedes le quieran Llamar al final
  2512. 1:54:37es lo mismo No y este método me va a
  2513. 1:54:41traer un nuevo objeto
  2514. 1:54:45por request matcher Ok y esto puede
  2515. 1:54:49traerme una colección Pues de diferentes
  2516. 1:54:53de diferentes en points que yo quiera
  2517. 1:54:56hacer los públicos No aquí voy a colocar
  2518. 1:54:58New and pad request matcher Ok y aquí yo
  2519. 1:55:02voy a colocar pues la URL que en este
  2520. 1:55:04caso va a ser pública no Perfecto
  2521. 1:55:07entonces aquí qué es lo que vamos a
  2522. 1:55:09vamos a
  2523. 1:55:12la dirección url de nuestra Api pública
  2524. 1:55:16En este caso OK Vamos a ponerle ese
  2525. 1:55:18Hello public OK Para que no haya ninguna
  2526. 1:55:22ninguna confusión Entonces vamos a
  2527. 1:55:25copiar a big rating OK Vamos a Security
  2528. 1:55:29config lo colocamos aquí es leash y
  2529. 1:55:31vamos a nuestro controlador greating Ok
  2530. 1:55:34y copiamos 6 Hello pública muy bien
  2531. 1:55:37perfecto vamos a colocarlo aquí y listo
  2532. 1:55:40entonces si yo ahorita guardo ok
  2533. 1:55:45y levanto mi aplicación que veamos el
  2534. 1:55:48Run cómo está ejecutándose
  2535. 1:55:50perfecto una de Las observaciones que
  2536. 1:55:53podemos nosotros ya ir viendo es que si
  2537. 1:55:56ustedes recuerdan al inicio pues
  2538. 1:55:57generaba automáticamente el password no
  2539. 1:56:00O sea había una password que protegía
  2540. 1:56:02los enpoints ya no se genera Pues que
  2541. 1:56:05porque nosotros ya hemos realizado
  2542. 1:56:07nuestras propias configuraciones de
  2543. 1:56:08Sprint Security Ok eso como primero
  2544. 1:56:11ahora yo ya tengo preparado aquí en
  2545. 1:56:14postman
  2546. 1:56:16esa petición Ok entonces si yo coloco
  2547. 1:56:19aquí 6 Hello protected ok
  2548. 1:56:23no perdón 6 Hello public primero
  2549. 1:56:29see Hello public Ok Déjenme
  2550. 1:56:33verting controles say hello publique
  2551. 1:56:39Déjenme revisarlo por aquí hubo un
  2552. 1:56:42pequeño error vamos aquí a Security
  2553. 1:56:45Ok dice que la URL es Api greeting
  2554. 1:56:506 Hello public
  2555. 1:56:55greeting
  2556. 1:56:576 Hello pública Ok revisamos la consola
  2557. 1:57:02vamos a enviar ok Ya sé qué es lo que
  2558. 1:57:06está sucediendo un error mío errores de
  2559. 1:57:10humanos y es que claro estoy creando los
  2560. 1:57:12los points pero pues no los estoy no les
  2561. 1:57:16estoy dando los permisos acá Ok entonces
  2562. 1:57:18bueno reemplazamos de eso voy a dejar
  2563. 1:57:20este error ahí en video para que lo vean
  2564. 1:57:23Porque puede llegar a pasar vamos a
  2565. 1:57:25detener nuestra aplicación Ok guardamos
  2566. 1:57:27cambios ejecutamos de nuevo Ok veamos
  2567. 1:57:31que nuestra aplicación se ejecute de
  2568. 1:57:33forma correcta
  2569. 1:57:35Ok
  2570. 1:57:36perfecto
  2571. 1:57:38se ha inicializado y ahora sí vamos a
  2572. 1:57:41probar de nuevo y miren ahora sí me
  2573. 1:57:43devuelve el Hello from a pictures OK
  2574. 1:57:46Pero si yo en este momento por ejemplo
  2575. 1:57:49quiero testear mi controlador y quiero
  2576. 1:57:53ya no quiero public sino protect ustedes
  2577. 1:57:56van a ver que por defecto OK Vamos a
  2578. 1:57:59reemplazar esto Aquí vamos a colocar 6
  2579. 1:58:02Hello protector ustedes van a ver que me
  2580. 1:58:05da un estatus 403 forbidden OK Porque
  2581. 1:58:09porque pues si ustedes recuerdan en el
  2582. 1:58:12Security yo mencioné que Bueno aparte de
  2583. 1:58:16los publiques en points voy a permitir a
  2584. 1:58:18todos acceder a ellos cualquier otra
  2585. 1:58:21petición que se realice al servidor debe
  2586. 1:58:23ser autenticada para poder acceder a ese
  2587. 1:58:26recurso Entonces en este aspecto
  2588. 1:58:29nosotros ya vemos y hemos este
  2589. 1:58:33configurado nuestra aplicación para que
  2590. 1:58:35proteja Ok las peticiones que están
  2591. 1:58:38entrando dentro del servidor y está
  2592. 1:58:41solicitando que primero tenga que ser
  2593. 1:58:42autenticado es por eso que nos regresa
  2594. 1:58:44nuestro estatus 403 forbidden Ok
  2595. 1:58:48perfecto ahora vamos a Ahora sí a probar
  2596. 1:58:53nuestro controlador de registro y
  2597. 1:58:58autenticación
  2598. 1:59:02Ok entonces vamos a probar nuestros en
  2599. 1:59:06points tanto de registro como de
  2600. 1:59:08autenticación Ok de nuestro nuestros
  2601. 1:59:12usuarios Ok entonces yo ya tengo
  2602. 1:59:14preparado aquí en nuestra herramienta
  2603. 1:59:16postman Ok
  2604. 1:59:17ambas peticiones lo primero que vamos a
  2605. 1:59:21hacer es registrar un usuario Ok First
  2606. 1:59:23name Last email y password son los
  2607. 1:59:25campos que yo pues requiero en esta
  2608. 1:59:28petición porque es lo que me está
  2609. 1:59:30pidiendo Recuerden el modelo me pide
  2610. 1:59:31esos cuatro Campos
  2611. 1:59:34Ok entonces vamos a enviar esta petición
  2612. 1:59:38y miren me acaba de dar un forbile OK Y
  2613. 1:59:42si ustedes recuerdan obviamente Esto se
  2614. 1:59:45está dando Porque yo aún no he colocado
  2615. 1:59:47este estas urls como públicas no
  2616. 1:59:50Entonces voy a copiar este pad de aquí
  2617. 1:59:53OK Porque como quiero que ambas ureles o
  2618. 1:59:56sea es decir todo el control controlador
  2619. 1:59:58sea público voy a copiar este pack de
  2620. 2:00:01aquí Ok y vamos a crear un nuevo
  2621. 2:00:05antpad request matcher Ok y vamos a
  2622. 2:00:09colocar ese pack y le vamos a dar un
  2623. 2:00:11Slash asterisco asterisco indicando que
  2624. 2:00:15todo el controlador va a ser público es
  2625. 2:00:17decir todas las peticiones como pueden
  2626. 2:00:19ver aquí tanto teticaria y registro van
  2627. 2:00:21a ser públicas en cambio acá simplemente
  2628. 2:00:23pues estoy haciendo referencia a una URL
  2629. 2:00:27en específico en este caso a todo un
  2630. 2:00:29controlador como tal Ok perfecto
  2631. 2:00:32guardamos los cambios le tenemos la
  2632. 2:00:35aplicación vamos vamos a inicializar de
  2633. 2:00:39nuevo nuestra aplicación Ok
  2634. 2:00:42y vamos a ver cómo se comporta nuestra
  2635. 2:00:45full con Spring Security y Jason web
  2636. 2:00:49tokens Ok entonces vamos a ir a nuestro
  2637. 2:00:54postman y ahora sí vamos a
  2638. 2:00:57registrar a nuestro usuario
  2639. 2:01:01perfecto y miren ahora sí me devuelve un
  2640. 2:01:04estatus 200 Ok junto con un token
  2641. 2:01:08generado por mí misma aplicación
  2642. 2:01:13Ok junto con un toque generado por
  2643. 2:01:17mi aplicación Ok entonces antes de
  2644. 2:01:19seguir probando vamos a ver qué
  2645. 2:01:21información contiene este token como tal
  2646. 2:01:24vamos a ir a nuestra página Jason web
  2647. 2:01:27token punto y vamos a pegarlo Ok y miren
  2648. 2:01:31lo primero que encontramos es el
  2649. 2:01:33algoritmo con el que nosotros pues este
  2650. 2:01:35configuramos el Jason web token que es
  2651. 2:01:38el hs
  2652. 2:01:39256 Ok qué más tenemos de información el
  2653. 2:01:43subjet que en este caso es el email que
  2654. 2:01:45estamos utilizando como identificador
  2655. 2:01:47único para poder poder
  2656. 2:01:50autenticarse o loguearse dentro de
  2657. 2:01:52nuestra aplicación Ok y miren También
  2658. 2:01:54tenemos la fecha de emisión de este
  2659. 2:01:58token que es el bueno a la fecha de hoy
  2660. 2:02:01sería el 16 de julio del 2023 hora
  2661. 2:02:04Ecuador a las 8:48 de la noche OK y
  2662. 2:02:09veamos la fecha de expiración que
  2663. 2:02:10Esperamos que sea pues de 24 horas la la
  2664. 2:02:14diferencia de expiración no Ok y se va a
  2665. 2:02:18caducar a él Ah no perdón no es sábado
  2666. 2:02:20es domingo Ah ya el domingo y se va a
  2667. 2:02:23caducar el domingo a las 9 de la noche
  2668. 2:02:26okay Aquí hubo un error al parecer
  2669. 2:02:28Estamos dándole solo una hora de
  2670. 2:02:30diferencia vamos a ir a nuestro código
  2671. 2:02:33Ok y vamos a irnos a nuestro servicio
  2672. 2:02:37Aquí es donde configuramos a ver mi
  2673. 2:02:40segundo 60 Segundos Okay okay Me faltó
  2674. 2:02:44agregarle los 60 minutos que tiene una
  2675. 2:02:47hora y ahí sí ya estaría como una
  2676. 2:02:49diferencia de un día Ok estos valores
  2677. 2:02:51pues ustedes los pueden acomodar a como
  2678. 2:02:53ustedes quieran si quieren pues pueden
  2679. 2:02:55darle solo 15 minutos de de de tiempo de
  2680. 2:03:00expiración al toque no 10 minutos o en
  2681. 2:03:02este caso un día o meses ya depende de
  2682. 2:03:05ustedes cuánto tiempo quieran darle no
  2683. 2:03:07en este caso pues vamos a utilizar un
  2684. 2:03:10día de diferencia Ok entonces vamos a
  2685. 2:03:14parar la aplicación guardar nuestros
  2686. 2:03:17cambios OK Vamos a correr de nuevo la
  2687. 2:03:20aplicación
  2688. 2:03:25perfecto
  2689. 2:03:28muy bien
  2690. 2:03:30Se ha inicializado la aplicación y en
  2691. 2:03:33este caso pues vamos a cambiar el nombre
  2692. 2:03:35ok vamos a poner yo que sé John doe OK
  2693. 2:03:40Para que haya dos usuarios John doe en
  2694. 2:03:42este caso va a ser John arroba
  2695. 2:03:44ejemplo.com igual la misma contraseña y
  2696. 2:03:48vamos a registrarlo
  2697. 2:03:50Ahora sí nos devuelve igual un token y
  2698. 2:03:53veamos qué es lo que contiene este token
  2699. 2:03:54vamos a reemplazar este de aquí por el
  2700. 2:03:57nuevo y miren Bueno ahí está el usuario
  2701. 2:04:00está la fecha de emisión que es el 16 de
  2702. 2:04:04Julio un domingo a las 8:51 de la noche
  2703. 2:04:07y la fecha de caducidad que ahora sí es
  2704. 2:04:10del lunes 17 de 17 de julio del 2023 a
  2705. 2:04:16las 8:51 de la noche Aquí sí ya tenemos
  2706. 2:04:17una diferencia de 24 horas qué más
  2707. 2:04:20podemos ver pues la firma hmac 256 que
  2708. 2:04:24si ustedes recuerdan pues lo hicimos con
  2709. 2:04:26nuestra clase Kiss Ok entonces Esta es
  2710. 2:04:29la información de nuestro Jason web
  2711. 2:04:31token que nosotros hemos configurado
  2712. 2:04:35ahora qué es lo que vamos a hacer vamos
  2713. 2:04:37a probar que efectivamente este token a
  2714. 2:04:40mí me esté dando permisos para acceder a
  2715. 2:04:43la información pero antes que nada vamos
  2716. 2:04:45a ir a nuestra base de datos hagamos un
  2717. 2:04:47Select y miren Aquí están los dos
  2718. 2:04:49usuarios registrados bueno que acabamos
  2719. 2:04:51de registrar okay Y qué es lo que
  2720. 2:04:54podemos ver nosotros aquí por ejemplo
  2721. 2:04:57podemos ver el email el primer nombre el
  2722. 2:05:01apellido y también podemos ver como las
  2723. 2:05:03claves han sido encriptadas no entonces
  2724. 2:05:06Beck password de de
  2725. 2:05:10bueno la clase B password es la que
  2726. 2:05:13responsable de haber encriptado esto y
  2727. 2:05:15esto obviamente pues es una práctica
  2728. 2:05:18ya ni siquiera buena práctica sino una
  2729. 2:05:21práctica obligatoria que en una base de
  2730. 2:05:23datos estén encriptadas las las
  2731. 2:05:25contraseñas no OK Y tenemos los roles
  2732. 2:05:28que están en cero y cero si ustedes
  2733. 2:05:29recuerdan pues este estamos manejandolo
  2734. 2:05:32con Index a los roles No si nosotros
  2735. 2:05:34vamos pues a nuestro
  2736. 2:05:36proyecto vamos a ir a nuestro user y
  2737. 2:05:39vamos y Recuerden que pues nosotros
  2738. 2:05:41estamos utilizando un enumerado de tipo
  2739. 2:05:45ordinal Entonces se va a manejar con
  2740. 2:05:47órdenes no entonces por eso el rol está
  2741. 2:05:50en cero porque ambos son usuarios
  2742. 2:05:51comunes y corrientes OK ahora vamos a
  2743. 2:05:56probar el token que nos en el registro
  2744. 2:05:58Ok entonces copiamos este token y ahora
  2745. 2:06:02quiero este bueno como ustedes pueden
  2746. 2:06:04ver pues está prohibido el acceso a
  2747. 2:06:07Hello protect porque no he enviado
  2748. 2:06:09ninguna nada en mi cabecera de
  2749. 2:06:11autorización Entonces ahora vamos a ir
  2750. 2:06:13autorización y vamos a elegir bitter
  2751. 2:06:16token como tal Ok entonces pues
  2752. 2:06:18obviamente está configuración de postman
  2753. 2:06:20automáticamente va a mandar beatter un
  2754. 2:06:22espacio y lo que nosotros peguemos en el
  2755. 2:06:25token aquí directamente
  2756. 2:06:27Entonces si nosotros enviamos esto miren
  2757. 2:06:30ya me retorna un Hello from apijacks
  2758. 2:06:33protected y con este token ya puedo
  2759. 2:06:35acceder a este recurso que en un inicio
  2760. 2:06:38estaba protegido vamos a validar otra
  2761. 2:06:41cosa vamos a cambiar algo del token
  2762. 2:06:43vamos a agregarle yo que sé una de y una
  2763. 2:06:46G Al final para comprobar que este token
  2764. 2:06:49ya no es auténtico Es decir ya no es un
  2765. 2:06:51token generado por nosotros y De igual
  2766. 2:06:54forma estoy enviando una autorización y
  2767. 2:06:55un toque vamos a ver si con la
  2768. 2:06:57modificación nos deja igual acceder a
  2769. 2:06:59este recurso Y de nuevo Nos está dando
  2770. 2:07:02un estatus forbidden como tal Ok
  2771. 2:07:06entonces hemos comprobado que en la
  2772. 2:07:10petición de registro el registro de un
  2773. 2:07:13usuario la encriptación de la contraseña
  2774. 2:07:14y el token que nos retorna es totalmente
  2775. 2:07:17válido Por lo cual el proceso de
  2776. 2:07:21autenticación bueno el proceso de
  2777. 2:07:23registro y autenticación con el token
  2778. 2:07:26está perfectamente bien Ahora vamos a
  2779. 2:07:30probar que la petición de autenticación
  2780. 2:07:33efectivamente funcione no Ya me registré
  2781. 2:07:36como usuario me dio un token ahora
  2782. 2:07:37suponiendo que yo ya tengo un usuario
  2783. 2:07:40como tal
  2784. 2:07:41ok En este caso vamos a utilizar el
  2785. 2:07:44nuevo usuario que era John
  2786. 2:07:46arroba ejemplo no como podemos ver si
  2787. 2:07:49nosotros vamos a la base de datos era
  2788. 2:07:51John arroba ejemplo.com Ok y vamos a
  2789. 2:07:54utilizar la clave con la que se registró
  2790. 2:07:56recuerden uno dos tres cuatro cinco seis
  2791. 2:07:58es una clave netamente de ejemplo y
  2792. 2:08:00vamos a enviarlo vamos a ver qué es lo
  2793. 2:08:02que sucede perfecto se autentico
  2794. 2:08:05perfectamente bien ok se hizo login me
  2795. 2:08:08devolvió un token de acceso Ok si
  2796. 2:08:11nosotros volvemos aquí a nuestra
  2797. 2:08:12herramienta jwt punto io vamos a ver qué
  2798. 2:08:16tiene la información Ok y la fecha de
  2799. 2:08:19expedición y de expiración de este token
  2800. 2:08:22perfecto muy bien Ahora vamos a ver si
  2801. 2:08:23este token no sirve para Acceder al
  2802. 2:08:25recurso protegido que en este caso sería
  2803. 2:08:27saludar 6 Hello projected Ok enviamos el
  2804. 2:08:32token y miren perfectamente me devuelve
  2805. 2:08:35el Hello from Api jacks project Ok
  2806. 2:08:39Perfecto entonces hasta este punto ya
  2807. 2:08:43hemos nosotros desarrollado e
  2808. 2:08:46implementado Sprint Security con Jason
  2809. 2:08:51web tokens
  2810. 2:08:54muy bien Qué les ha parecido esta
  2811. 2:08:56tercera fase del curso desarrollo web
  2812. 2:08:58con Spring Boot Espero que les haya
  2813. 2:09:00gustado Spring Security con Jason web
  2814. 2:09:02tokens Yo sé que pues hay una gama de
  2815. 2:09:05frameworks este increíble no dentro de
  2816. 2:09:07Spring que se pueden integrar está el
  2817. 2:09:09protocolo autos.0 y pues bueno varias
  2818. 2:09:13herramientas más pero yo creo que Spring
  2819. 2:09:15Security con Jason web tokens son un
  2820. 2:09:18buen Punto de partida para la gente que
  2821. 2:09:19está empezando Pues en este framework no
  2822. 2:09:21se preocupen iremos sacando más
  2823. 2:09:23contenido de desarrollo en el canal
  2824. 2:09:27espérenlo y ya se les dirá avisando poco
  2825. 2:09:31a poco no se olviden también de
  2826. 2:09:32seguirnos de nuestro Instagram y bueno
  2827. 2:09:33me queda felicitarles y agradecerles a
  2828. 2:09:36la gente que ha llegado hasta este punto
  2829. 2:09:38del curso que ha estado comentando
  2830. 2:09:40dejando un like compartiendo
  2831. 2:09:41suscribiéndose al Canal porque de esa
  2832. 2:09:43forma nos posicionan a jax Pues con el
  2833. 2:09:46algoritmo de YouTube y nos recomiendan
  2834. 2:09:48más y nos ayuda a crecer mucho más OK
  2835. 2:09:50entonces sin enrollarme mucho más
  2836. 2:09:53agradecer todos Y de nuevo volverles a
  2837. 2:09:56recomendar que por favor dejen un like
  2838. 2:09:57Comenten se suscriban compartan Este
  2839. 2:10:00vídeo para llegar a mucha más gente y
  2840. 2:10:01así hacer crecer más de esta comunidad
  2841. 2:10:03de este canal que ahorita está pequeña
  2842. 2:10:05pero ya consistente Y también decirles
  2843. 2:10:09que no no me he olvidado de leerlos en
  2844. 2:10:11los comentarios y ya he visto a gente
  2845. 2:10:13que quiere que realicemos un proyecto
  2846. 2:10:15tal vez integrando algunos de estos
  2847. 2:10:17conocimientos
  2848. 2:10:19posiblemente lo hagamos ya lo estaremos
  2849. 2:10:22realizando en un futuro espérennos que
  2850. 2:10:24vamos a tener mucho más contenido Así
  2851. 2:10:26que yo me despido esto es Jacques Mi
  2852. 2:10:29nombre es Alex y nos estaremos viendo
  2853. 2:10:30hasta la próxima
  2854. 2:10:32[Música]

About this transcript

This page contains the full transcript of Spring Security | Implementando Spring Security + JWT by JAAX, generated from the public captions YouTube serves with the video. The transcript has 18,399 words across 2,854 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.