Dudas auth0

LR

Como no sabia muy bien donde preguntar sobre esto, lo dejo por aqui.

Tengo mi proyecto con sus endpoints protegidos con un middleware para que compruebe si esta logeado y demas.

Hasta ahora lo tenia todo hecho a mano.

La cosa es que quiero intentar meterle auth0 pero no me aclaro con la puta documentacion, ya que no paro de buscar y todo es "mira, clona este repo y veras como lo usamos"

Me parece muy bien, pero yo lo que quiero es ver las especificaciones del sdk para ver como implentarlo y no hacer un c&p que solo me sirve para lo que vosotros querais hdp.

La cosa es, que si, he mirado y se como hacer todo el tema del login y proteger las rutas tanto en front como en la api. El problema es que ahora mismo lo tengo todo hecho de forma de que necesito datos del usuario para poder interactuar con la api.

Hay alguna forma de recuperar en la api los datos que devuelve auth0 al hacer login? Me refiero a si en el token que envia y el solo comprueba se puede luego extraer alguna informacion o solicitar datos extra, ya que lo unico que se me ocurre es muy muy cutre y seria enviarlo a parte en la peticion a la api desde el front, que ahi si que es facil recuperarlo pero no creo ni que sea lo correcto ni obviamente que sea lo mas seguro.

Recapitulando:

  • Proyecto en react + node
  • tengo el login
  • tengo las rutas protegidas para que interactue con el login de auth
  • No se como coño recuperar datos del usuario en el back para usarlo para mis cosas

Alguna ayuda?

ShodawN

Sin lenguaje en el que lo has montado mucha ayuda no creo que consigas... de todas formas echa un vistazo a claims.
Con claims puedes recuperar la información que necesites.

1 respuesta
LR

#2 cierto se me pasó. Estoy con react + node

Wei-Yu

qué datos necesitas del usuario? el token de base te trae la identidad + permisos y scopes que le metas y además te deja meterle metadatos simples

no sé si te entendí bien, pero el jwt al final no deja de tener el payload en base64, una vez hayas validado que está bien (no caduco, bien firmado, etc etc), con hacer un atob() del payload (el medio) puedes ver toda la info

Asumiendo que la variable donde tienes el token se llama userToken, JSON.parse(atob(userToken.split('.')[1])). Si tienes el payload encriptado (que no está por defecto) tendrás que tirar de la lib de cripto de turno si no te lo hace la propia lib de auth0.

2 respuestas
PiradoIV

Añade un "claim" para que incluya el email, luego con el email ya tiras del resto de información en tu propia base de datos. Si no tienes muy claro cómo montar la autenticación con Auth0, intenta tirar de biblioteca para no liarla con la seguridad.

Para aprender, tira de https://oauth.net

JuAn4k4

Lo que te dicen, Auth0 no deja de ser un identity provider y un oauth server (Que te hace de puente a otros identity providers cómo pueden ser google, github, etc). Es decir, lo que tienes que aprender es OAuth, sus flujos, lo que es cada concepto y cómo funciona.

Al final no es más que un proveedor de JWT que tu validas (que lo ha generado Auth0 para ti así resumiendo), y entonces ya confías en lo que pone en ese JWT de quién es esa persona.

Como te dicen normalmente se usa el sub, que es un claim con el user_id, que tu matcheas contra tu db.

La historia empieza cuando varias identidades (google, fb, github, etc) todas tienen el mismo email, o están asociadas a la misma cuenta en tu DB.

Esto tienes que pensar como quieres hacerlo, que luego es un pifostio.

1 1 respuesta
GuaNaGe

Realmente implementando JWT ya tienes lo que necesitas yo creo... Parte del token lleva info del usuario que además tu eliges si quieres.

LR

Pues o algo he entendido mal viendo la documentación y los ejemplos o no se.

Lo que había entendido es que con la llamada que haces en el front, te genera el token y te lo devuelve. Luego ese token lo pasas al back y en el back vuelve a hacer otra petición al SDK, de ahí que necesites tener los 2 registrados en el Dashboard, y ahí comprueba que la integridad del token este bien y te devuelve el ok.

Entonces puedo olvidarme de las peticiones del back y tratar yo mismo el token y pista igual que hacía hasta ahora con el que generaba yo no?

Lo único meterle el claim en la petición del front para pedir más datos si los necesito no?

Es que me suena haber visto por encima algo como lo que comenta #4 pero ser de versiones antiguas con otras librerías que ya no usan y demas

PiradoIV

No necesitas que el back llame a Auth0 para comprobar el token. Auth0 y tu backend tienen claves compartidas para poder comprobar la firma localmente.

LR

Al final ha sido mas facil de lo que pensaba.

Era solo añadir una regla al dashboard de auth0 para decirle que me pase el email en el token y listo.

Lo de #4 tampoco hace falta realmente, con un jwt decode va sobrado a no ser que me este perdiendo algo.

Aun asi, mirare oauth en condiciones como dice #6 que esto ya digo, era por probar y darle "otro toque" que no fuese mi propio registro/login por darle comodidad al supuesto usuario final.

1 respuesta
PiradoIV

4 1 respuesta
LR

#11 ahora me estoy peleando con la integración con hotmail y Facebook....es..."interesante"

Lo mismo con oauth es más "fácil" y tardo menos, no se luego mirare

JuAn4k4

#10 No puedes confiar en el JWT token sin más, tienes que validarlo.

1
LR

Refloto esto.

He estado haciendo pruebas. Por un lado, las cosas con la api me funcionan bien y recupero los datos sin problemas.

La cosa es que me he puesto a probar con el front, y veo que no me esta guardando la sesion y no tengo ni zorra de por que. Tengo ahora mismo 2 proyectos en la misma app de auth0, una la de prueba que tienen ellos en github que es con la que he ido probando de todo antes de empezar a meterlo en ni proyecto, y el otro, el mio.

Tengo el provider, la configuracion es la misma en los 2 cambiando los puertos, pero el de prueba de ellos mantiene la sesion durante 24h y en el mio, no tiene persistencia la sesion al refrescar. Alguna idea?

LR

Vale, solucionado, era tema del redirect y del callback que no los tenia bien y entonces solo me los guardaba en memoria.

Ahora tengo otro problema, esta vez pasando informacion a la api.

En react, pido el token, me recupera bien los datos y lo envio a la api para hacer las peticiones a los endpoints.

El token se manda bien a la api. El problema viene en que no hay cojones a decodificarlo.

Si uso la api de pruebas que dan ellos, funciona sin problemas, si lo implemento en la mia, me peta.

Segun la documentacion, el codigo para validar es simplemente esto:

const { auth } = require('express-oauth2-jwt-bearer')

const validateAccessToken = auth({
  issuerBaseURL: `https://${process.env.AUTH0_DOMAIN}`,
  audience: process.env.AUTH0_AUDIENCE
})

Al usarlo en el de pruebas, me deja hacer con el lo que me de la gana, de hecho puedo decodificarlo y hacer de todo, pero al implementarlo en el mio, me da este error:

You must provide a 'tokenSigningAlg' for validating symmetric algorithms

Da igual que le asigne el algoritmo o no, si se lo asigno me da otro error.

InvalidTokenError: KeyObject or CryptoKey instances for asymmetric algorithms must not be of type "secret"

Cosa que se supone que no deberia pasar, ya que al usar el login nuevo que tiene auth0, las claves publicas y todo lo demas van de forma automatica, por lo que no deberia pedirme nada.

En esto si que me pilla un poco sin saber por donde tirar o por donde mirar, ya que segun la documentacion, solo piden eso, cosa que se ve que no es asi.

Usuarios habituales

  • LR
  • JuAn4k4
  • PiradoIV
  • GuaNaGe
  • Wei-Yu
  • ShodawN