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

Consideraciones para producción

37

Buenas prácticas para el despliegue en producción

38

Uso de diferentes tenants para producción con Auth0

Cierre del curso

39

Cierre del curso

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 20

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Sólo una acotación.

Las versiones recientes de express, incorporan un middleware llamado “json”, por lo cual no sería necesario instalar al proyecto la dependencia “body-parser”. Lo pueden utilizar de la siguiente forma:

const express = require(“express”);

const app = express();

app.use(express.json());

Saludos!

Generar AUTH_JWT_SECRET rápido y fácil en Linux

echo $(date) "$RANDOM"  | sha256sum

Puedes generar la cadena de 256 bit aquí en la opción SHA 256-bit Key

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

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

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.

Hay manera de generar un refresh token en un JWT ?

Donde puedo generar una cadena aleatoria de 256 byte ?

Salio a la primera… Excelente explicación 😃

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

hola compañeros, si al momento de hacer debuggin del acces_token en JSON Web Tokens les aparece justo en payload solo el campo ( “iat”: 1660111605) es porque el acces_token no esta completo y esto podría ser que en postman donde seleccionados el campo (row) a la par de GraphQl esta el formato de como se puede mostrar el acces_token tiene que ser en formato JSON, si no te va dar el acces_token erróneo y al momento de debbugear tendrás ese problema

aquí también pueden generar su clave https://www.online-convert.com

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 “iat”: ####### 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 “access_token” es algún tipo de estándar?

Simpre se utiliza la misma AUTH_JWT_SECRETo como puede dinamizarse esto ?