Aprendiendo sobre el concepto de microservicios en Nodejs, configuré dos microservicios de autenticación y usuarios , ambos independientes y ejecutándose en diferentes puertos.
El servicio de autenticación maneja la creación de usuarios y los usuarios que inician sesión con un nombre de usuario y una contraseña. Esto funciona como se esperaba. He usado jwt para generar los tokens. Puedo crear fácilmente un usuario, crear un token de sesión y verificar su validez.
Mi segundo servicio, usuarios, tengo la intención de usarlo para mostrar saludos a los usuarios y obtener los detalles de un usuario. Necesito usar el servicio de autenticación para saber cuándo un usuario inició sesión en esta configuración.
Sin embargo, con mi funcionamiento actual, cuando trato de ir a un punto final, /users/:id/sayhello con una identificación de usuario válida y un token válido pasado en los encabezados, obtengo los siguientes errores:
TypeError: Cannot read properties of undefined (reading 'id') at /path/auth/verifyToken.js:23:21 .
Y luego esto; de jwt:
{ "name": "JsonWebTokenError", "message": "secret or public key must be provided" }Veamos mi configuración ahora.
Aquí está mi archivo verificarToken.js del servicio de autenticación :
const verifyToken = (req, res, next)=>{ const authHeader = req.headers.token // split the header, and get the token "Bearer token" const token = authHeader.split(" ")[1]; if (authHeader) { jwt.verify(token, process.env.JWT_SEC, (err, user)=>{ if (err) res.status(403).json(err); req.user = user next(); }) } else { return res.status(401).json("You are not authenticated") } } const verifyTokenAndAuthorization = (req, res, next) =>{ verifyToken(req, res, ()=>{ if(req.user.id === req.params.id){ // error traced back to this line next(); }else{ res.status(403).json("Permission denied!"); } }) }De mi servicio de usuarios , aquí está el código que usa el servicio de autenticación para saber cuándo el usuario ha iniciado sesión y luego decir hola.
app.get("/users/:id/sayhello", verifyTokenAndAuthorization, async (req, res) => { try { const user = await User.findById(req.params.id); console.log(req.params.id) // undefined res.status(200).json(`Hello ${user.username}`); } catch (error) { res.status(500).json(error); } });He buscado sin éxito ninguna pista de publicaciones similares como A , B y C
No estoy seguro de lo que no está bien. Apreciaré posibles sugerencias y pistas para solucionarlo.
console.log(process.env.JWT_SEC) El proceso de autenticación falló, por lo que la propiedad del usuario no se estableció en el objeto req, por lo que req.user es null . Asegure la integridad de sus entradas.