Yo lo hice en Python, usando Django y una libreria que se llama pyjwt
Bienvenida e introducción
Qué aprenderás sobre autenticación con OAuth
Stack de seguridad para aplicaciones modernas
Autenticación
Autorización
JSON Web Tokens
JSON Web Tokens
Autenticación tradicional vs JWT
Configuración inicial de los proyectos
Firmando un JWT
Verificando nuestro JWT firmado y buenas practicas con JWT
Server-Side vs Client-Side sessions
Protegiendo nuestros recursos con JWT
Habilitando CORS en nuestro servidor
Profundizando el concepto de JWKS
OAuth 2.0
Cómo elegir el flujo adecuado para OAuth 2.0
¿Qué es OAuth 2.0?
Conociendo el API de Spotify
Creando los clientes de Spotify y servicios iniciales
Implementando Authorization Code Grant
Usando nuestro access token para obtener nuestros recursos
Implementando Implicit Grant
Implementando nuestro servicio de autenticación
Modificando nuestro Layout
Implementando Client Credentials Grant
Implementando Resource Owner Password Grant
Implementando Authorization Code Grant (PKCE)
Open ID Connect
¿Qué es OpenID Connect?
Implementando OpenID Connect
Preocupaciones con JWT y OAuth 2.0
¿Cuáles son las preocupaciones con JWT?
¿Cuáles son las preocupaciones con OAuth 2.0?
Haciendo uso de Auth0
¿Qué es Auth0?
Auth0 Lock y auth0.js
Universal Login
Social Login con Auth0
Custom Social connection con Spotify
Multifactor authentication
Authorization Extension en Auth0
Consideraciones para producción
Buenas prácticas para el despliegue en producción
Uso de diferentes tenants para producción con Auth0
Cierre del curso
Cierre del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Guillermo Rodas
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
Yo lo hice en Python, usando Django y una libreria que se llama pyjwt
El reto lo intenté hacer lo más sencillo posible.
En este sitio generé las llaves públicas y privadas usando esta configuración, tambien las puedes generar “a palo”:
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:
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…🤡
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
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
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?