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

Protegiendo nuestros recursos con JWT

11/39
Recursos

Actualmente utilizamos dos algoritmos de cifrado para proteger nuestros JWT: RS256, donde necesitamos una llave publica y una privada para validar la informaci贸n desde el servidor y el cliente (utiliza la RSA Signature con SHA-256), y HS256, donde tenemos un poco menos de seguridad ya que, utilizamos a misma llave para generar y validar los tokens (utiliza el HMAC tambi茅n con SHA-256).

Aportes 20

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Yo lo hice en Python, usando Django y una libreria que se llama pyjwt

El reto lo intent茅 hacer lo m谩s sencillo posible.

  1. En este sitio gener茅 las llaves p煤blicas y privadas usando esta configuraci贸n, tambien las puedes generar 鈥渁 palo鈥:

  2. Modifico el API de esto:

app.post("/api/auth/token", function(req, res) {
  const { email, username, name } = req.body;
  const token = jwt.sign({ sub: username, email, name }, config.authJwtSecret);
  res.json({ access_token: token });
});

a esto

app.post("/api/auth/token", function(req, res) {
  const { email, username, name } = req.body;
  const token = jwt.sign({ sub: username, email, name }, config.jwtPrivateKey, { algorithm: 'RS256'});
  res.json({ access_token: token });
});

RS256
Jason Web Key Set
https://YOUR_DOMAIN/.well-known/jwks.json

https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets

Resumen:
JWT usa dos formas de cifrado:

  1. RS256: 馃攽馃攽 Un algoritmo de cifra asim茅trico, que utiliza dos llaves (una p煤blica y una privada). Es como si una puerta utilizara una llave para poner el seguro (la p煤blica) y otra para abrir ese seguro (la privada), no se puede utilizar una para realizar la funci贸n de la otra.馃攽
  • El servidor utiliza la llave privada para cifrar el mensaje y generar la firma.
    El cliente, que va a utilizar el token utiliza la llave publica (que se la envia el servidor) se utiliza para v谩lidar la firma del token.

  • La llave publica solo sirve para comprobar que el token es v谩lido, no sirve para firmarlo, solo es posible hacerlo con la llave privada.

  • Por este motivo, si se llegan a robar la llave p煤blica, no hacen nada con ella, pues solo sirve para comprobar el token, nada m谩s鈥︷煠

  1. HS256: 馃攽 Un algoritmo de cifra sim茅trico. Es decir, que se usa solo una llave para realizar la firma y comprobarla. Es como funcionan las llaves de los candados tradicionalmente, la misma llave sirve para poner y quitar el seguro.馃攼
  • Si se llega a perder la llave, se puede utilizar para generar y firmar un token y suplantar a un cliente, as铆 como si se pierden las llaves de la casa, pueden usar esa llave para abrir la puerta y entrar 馃槹

En conclusi贸n: Si el due帽o de la aplicaci贸n tiene control sobre el servidor y los clientes, puede usar el algoritmo HS256. Si no tiene control sobre los clientes, debe usar el algoritmo RS256.

Este es el standard que se menciona
https://tools.ietf.org/html/rfc7517#section-4

Challenge completado, no utilice bodyparser ya que se encuentra deprecated

https://github.com/ronmiand/jwt-api-js

A que se refiere con tener control sobre los clientes, el cliente es el navegador de un usuario no? como vas a tener control sobre su navegador鈥

hola , conforme al reto del profe lo que hay que hacer es crear una llave privada y una publica las llaves serian estas de ejemplo:

-----BEGIN PRIVATE KEY-----
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
/L9VdFT0slUvqJ5UAafTlWGTA2LFZg==
-----END PRIVATE KEY-----

y la otra seria la publica:

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgluZjxRWmdM77IljyHXX
pZ1Rf08szU5LwwBlpl5bM6uEoxjJ5KKOhCswDko5+rhVK2YKjPkaolRk0nUsSj+0
COdetVsX4d9vpeGMbci4DJGZ3ygTt6UOmjIRu984VzH4c/nyTZVp7dbMhwqDIQCK
R/qiRqTE7qfM3PPKFK8s9i8Wd1dSBSww871ghA5LCGIwU6DQeHl6EJpvkAw730hz
PuPIeEfeZHA4fpb/dMwdAjuVZkm4vxnVhiqCozTCqDXLBqIN1Ep7VY+IYR7Yt/MC
CVQizi9W0HlezDWJvRq+OxADb/Yr0d81PTyPMOaQSiM4OlreVeID6ee2+sXz9CgK
bTReMlnIsvHpoigX7XuAE/vFZnMC0rhxdZ/ZkJ/xTS6CrdHW5eHtS0wWoBwb6mMQ
WJmR083hJdrWIBC2kmoUfRtLEhAXK5N1GCDENoDlrIWR3kVHcpIQmzXi1LyB5r8A
OVQKVdn6OVABPLIkAhnkI5mbpcMNdj3gDkizapDsweEnNG0EFJXU4XHFo8xJUfnG
drAr/RDpvbFWGIaS0miqm64RxqIYfXnTR2jEcI+L9dvIrukfXEQ8yiOd7Ay8HJKx
pTxAzuRnnkT3B+ErfS/fZk7q4leSu7eyPzdD0v3L/UmZjqVkAM2lgBp3a8hZN1U8
HcaJkwMfzYySPvMVIezVj+MCAwEAAQ==
-----END PUBLIC KEY-----

una vez hechas las vas a colocar en el archivo .ENV que creamos, ejemplo de las llaves : private_key = (la llave privada) y public_key = (la llave publica) estas llave tienen que tener comillas " "
luego agregarlas en el config para llamarlas luego.

luego harmos la peticion post para la private key
y para la publica la peticion get o veryficacion

luego iremos a postman para firmarla enviando en el body los respectivos cleim

al generarse la firma vamos a jwt.iote para debbuger colocamos la firma y usaremos la llave privada de nuestro archivo .env para verificar que la firma es valida y listo

de esa manera lo hice, disculpa por todo ese texto jajaja solo que me perdi en como resolver el reto y me costo el poder realizarlo espero que ayude 馃

listo! https://github.com/ismaelviss/oauth2
me base en parte de los ejemplos detallados en otros comentarios.

Cuando se hace la decodificacion en https://jwt.io/ lee que el algoritmo es RS256 y en la parte de VERYFY SIGNATURE da opcion de poner las dos llaves dependiendo el caso:

Public Key or Certificate. Enter it in plain text only if you want to verify a token
,
Private Key. Enter it in plain text only if you want to generate a new token. The key never leaves your browser.

Cu谩ndo usar el algoritmo HS256 o RS256

Se puede usar un encriptado SHA512?

Cu谩ndo usar HS256 o RS256

OK nadie ha hecho el reto. veamos cuanto me demoro

Como se hace con un api, que se require consumir por los mobiles, apple, google etc, com se hace uso del Cors 鈥?

haber me dicen si mi idea esta correctamente de los jwt simetricos y asimetricos

los simetricos es la misma llave del lado del cliente y del lado del servidor por ejemplo una api rest que esta alimentando varios tipos de clientes como lo seria
una app en (android,ios) un website 鈥 etc a esto te refieres cuando mencionas le del cliente osea que tu eres due帽o de cliente / servidor

los asimetricos es para que no tengas que darle a tus clientes osea a los que generaron las apps de (android,ios) el website o que estan cosumiendo tus servicios tu clave privada 鈥 lo que haces es generar una clave privada con la que generas los tokens y una clave publica a los que usaran tus servicios asi no hay riesgo de que alguien mas genere tus tokens

o me equivoco ?

Si en el ejemplo anterior con la aplicaci贸n express hicimos uso de una generaci贸n de token sim茅trica (debido a que utilizamos s贸lo un JWT Secret), 驴en qu茅 momento es este secret comprometido al cliente? Entiendo que este secret es 煤nicamente manejado por el servidor y se hashea al generar el token, por ejemplo al no pasarle ning煤n algoritmo de firmado y guiandome por lo que dice jwt.io se utiliza HMACSHA256. Es decir que es b谩sicamente imposible saber mi secret teniendo el token. O me equivoco?

Pueden generar sus llaves desde la terminal con openssl:

> openssl genrsa -out key.pem 1024
> openssl rsa -in key.pem -outform PEM -pubout -out public.pem

Siento que en todo caso ser铆a mucho mejor y m谩s 煤til usar un algoritmo asim茅trico para evitar cualquier peligro, aun si t煤 tienes control del cliente