Actualmente estoy trabajando en una "Autenticación básica" para Node JS. Debería aceptar solicitudes como las siguientes:
POST http://localhost:8080/authenticate/ Authorization: Basic YWRtaW46MTIzAuthenticationService.js primero lee el encabezado y luego pasa todo a Userservice.js
Servicio de autenticación.js
async function basicAuth(req, res, next) { // make authenticate path public if (req.path === '/') { return next(); } if (!req.headers.authorization || req.headers.authorization.indexOf('Basic ') === -1) { return res.status(401).json({ message: 'Missing Authorization Header' }); } // verify auth credentials const base64Credentials = req.headers.authorization.split(' ')[1]; const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii'); const [username, password] = credentials.split(':'); console.log("AuthenticationService "+username+" "+password); const user = await userService.authenticate({ username, password }); if (!user) { return res.status(401).json({ message: 'Invalid Authentication Credentials' }); } req.user=user res.send(user) next(); } module.exports = { basicAuth }El servicio de usuario comprueba si se encuentra el usuario y comprueba si la contraseña es válida, solo entonces el objeto de usuario se envía de vuelta al servicio de autenticación.
UserService.js
async function authenticate({ username, password }) { let user = await User.findOne({userID: username}) user.comparePassword(password.toString(), function(err,isMatch) { if (err){ console.log("error") throw err; } if(isMatch) { console.log("Password correct") } if(!isMatch){ console.log("Password wrong") }}); if(user){ return user; } else{ return null; } } module.exports = { authenticate }El .comparePassword-Method está dentro de Usermodel.js :
UserSchema.methods.comparePassword = function(candidatePassword, cb) { bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { if (err) return cb(err); cb(null, isMatch); }); }; const User = mongoose.model("User", UserSchema); module.exports = User;¿Cómo puedo enviar el valor booleano de isMatch en Userservice.js fuera de su alcance, para poder enviar el objeto de usuario de vuelta a AuthenticationService.js dependiendo de la contraseña correcta? ¿Cómo puedo mejorar ese código?
Borro el método de autenticación en Userservice.js y simplemente llamo al método crud. Después de eso, llamo al método de comparación y dentro del bloque if/else paso un res.send .
function basicAuth(req, res, next) { if (!req.headers.authorization || req.headers.authorization.indexOf('Basic ') === -1) { return res.status(401).json({ message: 'Missing Authorization Header' }); } // verify auth credentials const base64Credentials = req.headers.authorization.split(' ')[1]; const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii'); const [username, password] = credentials.split(':'); console.log("AuthenticationService " + username + " " + password); userService.findUserById(username, function(error, user) { user.comparePassword(password.toString(), function(err, isMatch) { if (err) { console.log("Fehler") throw err; } /*Passwort richtig*/ if (isMatch) { res.send(user); } /*Passwort falsch*/ if (!isMatch) { res.status(401).json({ message: 'Passwort und userID stimmen nicht überein.' }); } }); }) }