Bienvenida e introducci贸n

1

Qu茅 aprender谩s sobre autenticaci贸n con OAuth

2

Stack de seguridad para aplicaciones modernas

3

Autenticaci贸n

4

Autorizaci贸n

JSON Web Tokens

5

JSON Web Tokens

6

Autenticaci贸n tradicional vs JWT

7

Configuraci贸n inicial de los proyectos

8

Firmando un JWT

9

Verificando nuestro JWT firmado y buenas practicas con JWT

10

Server-Side vs Client-Side sessions

11

Protegiendo nuestros recursos con JWT

12

Habilitando CORS en nuestro servidor

13

Profundizando el concepto de JWKS

OAuth 2.0

14

C贸mo elegir el flujo adecuado para OAuth 2.0

15

驴Qu茅 es OAuth 2.0?

16

Conociendo el API de Spotify

17

Creando los clientes de Spotify y servicios iniciales

18

Implementando Authorization Code Grant

19

Usando nuestro access token para obtener nuestros recursos

20

Implementando Implicit Grant

21

Implementando nuestro servicio de autenticaci贸n

22

Modificando nuestro Layout

23

Implementando Client Credentials Grant

24

Implementando Resource Owner Password Grant

25

Implementando Authorization Code Grant (PKCE)

Open ID Connect

26

驴Qu茅 es OpenID Connect?

27

Implementando OpenID Connect

Preocupaciones con JWT y OAuth 2.0

28

驴Cu谩les son las preocupaciones con JWT?

29

驴Cu谩les son las preocupaciones con OAuth 2.0?

Haciendo uso de Auth0

30

驴Qu茅 es Auth0?

31

Auth0 Lock y auth0.js

32

Universal Login

33

Social Login con Auth0

34

Custom Social connection con Spotify

35

Multifactor authentication

36

Authorization Extension en Auth0

Cierre del curso

37

Cierre del curso

Consideraciones para producci贸n

38

Buenas pr谩cticas para el despliegue en producci贸n

39

Uso de diferentes tenants para producci贸n con Auth0

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Firmando un JWT

8/39
Recursos

Para generar y firmar un JWT de manera sim茅trica vamos a instalar las siguientes dependencias:

npm i -S express dotenv jsonwebtoken body-parser

La librer铆a dotenv nos permite crear archivos .env con la informaci贸n que no podemos publicar de nuestro proyecto, por ejemplo, la llave secreta de nuestro JWT. Por otra parte, la librer铆a jsonwebtoken nos permite firmar nuestros tokens de manera sim茅trica.

Con nuestras dependencias instaladas y los archivos .env configurados, podemos programar nuestra aplicaci贸n, en esta clase vamos a crear un endpoint /api/auth/token donde debemos generar un token de usuario utilizando el m茅todo jwt.sign().

Aportes 18

Preguntas 5

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

S贸lo una acotaci贸n.

Las versiones recientes de express, incorporan un middleware llamado 鈥渏son鈥, por lo cual no ser铆a necesario instalar al proyecto la dependencia 鈥渂ody-parser鈥. Lo pueden utilizar de la siguiente forma:

const express = require(鈥渆xpress鈥);

const app = express();

app.use(express.json());

Saludos!

Puedes generar la cadena de 256 bit aqu铆 en la opci贸n SHA 256-bit Key

Generar AUTH_JWT_SECRET r谩pido y f谩cil en Linux

echo $(date) "$RANDOM"  | sha256sum

Este curso est谩 bueno para aquello dedicados a la programaci贸n, o quienes se enfocar谩n en servicios. Para hacking 茅tico, deber铆a hacerse un curso de Autenticaci贸n OAuth cuyo proyecto sea el hackeo de los tokens. Que todo lo explicado se oriente a:

  • c贸mo detectar los JWT/cookies en el tr谩fico web (Burp Suite, etc)
  • c贸mo decodificarlos, c贸mo identifiacr las codificaciones, o si hay algo anormal como medidas de seguridad extra (de nuevo, en BurpSuite u otros)
  • c贸mo modificar los campos y firmar para quebrar la seguridad del token, cu谩ndo es posible y cu谩ndo no. T茅cnicas hacking de acceso a servicios quebrando la autenticaci贸n y autorizaci贸n.
  • Ejemplos del mundo real; ejemplos en laboratorio con aplicaciones web vulnerables (Juice Shop, DVWA, etc)
  • Un largo ETC

Ir al Api
Construirlo desde cero
ver de que librerias depende
implementar

  • npm i -S express dotenv jsonwebtoken body-parser

  • dotenv: Donde se registra el secret

  • jsonwebtoken : Es la libreria que permite firmar y verificar el JWT

  • body_parser: Leer el body tipo jason del usuario que comparte el token

  • Esto se debe correr dentro del API

  • Se crea archivo .gitgnore para no enviar los archivos .env y la carpeta node_modules sea enviados al repositorio

  • se crea archivo .env.example y en el se crea la variable AUTH_JWT_SECRET=

  • Se copia el archivo .env.example y lo renombramos como .env

  • Se crea la carpeta config y dentro de ella requerimos la libreria dotenv y dentro de ella metemos la variable de entorno authJwtSecret

Hay manera de generar un refresh token en un JWT ?

En los enlaces de la clase pasada Guillermo compartio esta website https://keygen.io/#fakeLink para generar las cadenas de 256. SHA 256-bit Key

Salio a la primera鈥 Excelente explicaci贸n 馃槂

{
    "acess_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWRpcnMxNCIsImVtYWlsIjoibmFkaXJzczE0QGdtYWlsLmNvbSIsIm5hbWUiOiJOYWRpciBTb3phIiwiaWF0IjoxNTU4OTg0NTg5fQ.BHWCn5DEe9qRQ-mi secreto"
}

Los hashes son funciones no reversibles y que permiten generar una secuencia de bits a partir de una entrada, por tanto se supone son funciones unidireccionales es decir que a partir de hash no deber铆a ser posible la obtenci贸n del contenido que genero ese hash, sin embargo, entre los m茅todos que se usan para vulnerarlos son: La fuerza bruta generar hashes con diferentes cadenas hasta encontrar la coincidencia de hashes o las tablas ya generadas donde se busca el hash previamente generado.

me genera error al hacer el post

Error: secretOrPrivateKey must have a value<br> &nbsp; &nbsp;at Object.module.exports [as sign] (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/jsonwebtoken/sign.js:107:20)<br> &nbsp; &nbsp;at /mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/index.js:13:23<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at next (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/route.js:137:13)<br> &nbsp; &nbsp;at Route.dispatch (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/route.js:112:3)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at /mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/index.js:281:22<br> &nbsp; &nbsp;at Function.process_params (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/index.js:335:12)<br> &nbsp; &nbsp;at next (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/express/lib/router/index.js:275:10)<br> &nbsp; &nbsp;at jsonParser (/mnt/c/Users/luisk/OneDrive/Documents/Platzi/OAuth/platzi-autenticacion-configuracion-inicial-de-los-proyectos/api/node_modules/body-parser/lib/types/json.js:119:7)</pre>

Que es el valor 鈥渋at鈥: ####### que apareci贸 dentro de mi payload al hacer el debuger de mi token

Como puedo escribir

require('dotenv').config()

const config = {
    authJwtSecret: process.env.AUTH_JWT_SECRET
}

module.exports = { config }

en ES6

mano a la obra!!

Muy interesante.

Agregue esta linea para poder parsear el body del request: app.use(bodyParser.urlencoded({ extended: true }));

驴LLamar al token devuelto 鈥渁ccess_token鈥 es alg煤n tipo de est谩ndar?

Donde puedo generar una cadena aleatoria de 256 byte ?

Simpre se utiliza la misma AUTH_JWT_SECRETo como puede dinamizarse esto ?