Tengo la siguiente función, que autentica a un usuario creando un encabezado de respuesta:
function authenticateUser(res, id) { const payload = { id } const token = jwt.sign(payload, config.JWT_KEY, { expiresIn: '24h' }) res.set('authorization', token) res.redirect('/user/profile') res.end() }Sin embargo, cuando redirijo al /usuario/perfil, sale indefinido para el encabezado de autorización:
controller.checkAuthorizaion = (req, res, next) => { const token = getJWTToken(req) console.log(token); if(!token) Router.redirect(res, '/', 401) else { jwt.verify(token, config.JWT_KEY, (err, data) => { if(err) Router.redirect(res, '/', 401) else { res.userId = data.id next() } }) } }¿Por qué no funciona? ¿Cómo devuelvo mi token jwt al cliente? Pensé que jwt.sign() lo envía automáticamente.
Si usa jsonwebtoken , debe llamarlo como función async o proporcionar una devolución de llamada:
async function authenticateUser(res, id) { const payload = { id } const token = await jwt.sign(payload, config.JWT_KEY, { expiresIn: '24h' }) res.set('authorization', token) res.redirect('/user/profile') res.end() } getJWTToken(req) también debe llamarse async :
controller.checkAuthorizaion = async (req, res, next) => { const token = await getJWTToken(req) console.log(token); Y, por supuesto, dentro de getJWTToken : también debe llamar a jwt.verify como una función asíncrona.
Authorization es un encabezado de solicitud. No debe usarse en las respuestas y creo que la mayoría de los navegadores ignoran este encabezado en la respuesta.
Estás enviando una respuesta de redirección al navegador. El navegador lee esa respuesta y envía una nueva solicitud al punto final /user/profile . El navegador no agrega automáticamente el encabezado Authorization a sus solicitudes.
Si envía la solicitud original como una llamada AJAX, entonces deberá asegurarse de que el cliente que está utilizando (por ejemplo, axios) lea el encabezado de Autorización de la respuesta antes de enviar otra solicitud al punto final al que redirija. No lo he comprobado, pero estoy bastante seguro de que los clientes de JS como axios ignoran el encabezado de Autorización en las respuestas y no lo copiarán automáticamente en otra solicitud.
Aparte de eso, @Anatoly tiene algunos puntos válidos sobre cómo llamar a funciones asíncronas, así que échale un vistazo también.
¿Cómo devuelvo mi token jwt al cliente? Pensé que jwt.sign() lo envía automáticamente.
Normalmente, envía el token en el cuerpo de la respuesta y deja que su cliente lea el cuerpo y almacene el token en algún lugar: en la memoria, almacenamiento local, etc. Otra solución sería almacenar el token en una cookie, pero eso solo funcionará si ya posee el backend al que está llamando con el token. (Si posee el backend, entonces, de hecho, no tiene sentido usar tokens de acceso. Podría usar sesiones HTTP simples y antiguas).