Je construis une application node.js avec un système de passeport intégré. Comme je suis hébergé sur uberspace.de, je dois configurer mon fichier .htaccess dans la racine Web principale de la manière suivante:
RewriteEngine On RewriteRule ^(.*) http://localhost:34457/$1 [P]
Mon itinéraire express pour la connexion est: (accessible à https://stackoverflow.com/api/auth/login
)
router.post('/login', passport.authenticate('login', { successRedirect: '/account', failureRedirect: '/login?error=true' }));
Comme je comprends Passport, si une connexion réussie a été effectuée, je devrais être redirigé vers /account
et sinon, vers /login?error=true
.
Mais si j’effectue un POST en utilisant
url --data "[email protected]&password=test" http://[domain]https://stackoverflow.com/api/auth/login
le résultat est:
502 Proxy Error Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request POST https://stackoverflow.com/api/auth/login.
Reason: Error reading from remote server
Apache/2.2.15 (CentOS) Server at [domain] Port 80
Et si j’exécute la même requête par un html-form (Méthode: POST, Action: https://stackoverflow.com/api/auth/login
) dans Chrome, je suis redirigé vers https://stackoverflow.com/api/auth/login%5E
(qui renvoie sans conteste un 404
).
Les redirections simples comme celle-ci fonctionnent:
router.post('/redirectToHome', function(req, res, next) { res.redirect(302, '/'); });
Mais même si j’exécute cette fonction en appelant https://stackoverflow.com/api/auth/login
router.post('/login', function(req, res, next) { passport.authenticate('login', function(err, user, info) { if (err) return next(err); if (!user) { console.log(info); return res.json(401, {success: false}); } else { console.log(info); return res.json(200, {success: true}); } })(req, res, next); });
Je vais toujours être redirigé vers https://stackoverflow.com/api/auth/login%5E
.
Ma stratégie d’authentification pour la login
est implémentée comme suit:
var LocalStrategy = require('passport-local').Strategy; var User = require('../models/user'); var bCrypt = require('bcrypt-nodejs'); module.exports = function(passport){ passport.use('login', new LocalStrategy({ usernameField: 'email', passReqToCallback : true }, function(req, email, password, done) { // check in mongo if a user with username exists or not User.findOne({ 'email' : email }, function(err, user) { // In case of any error, return using the done method if (err) return done(err); // Username does not exist, log the error and redirect back if (!user){ console.log('User Not Found with email '+email); return done(null, false, req.flash('message', 'User Not found.')); } // User exists but wrong password, log the error if (!isValidPassword(user, password)){ console.log('Invalid Password'); return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page } // User and password both match, return user from done method // which will be treated like success return done(null, user); }); })); var isValidPassword = function(user, password){ return bCrypt.compareSync(password, user.password); } }
Même si le login
routeur est écrit comme suit:
router.post('/login', function(req, res, next) { passport.authenticate('login', function(err, user, info) { if (err) return next(err); if (!user) { console.log(info); return res.json(401, {success: false}); } else { console.log(info); return res.json(200, {success: true}); } })(req, res, next); });
Je suis toujours redirigé vers https://stackoverflow.com/api/auth/login%5E
.
Ma stratégie de login
passeport est implémentée comme suit:
var LocalStrategy = require('passport-local').Strategy; var User = require('../models/user'); var bCrypt = require('bcrypt-nodejs'); module.exports = function(passport){ passport.use('login', new LocalStrategy({ usernameField: 'email', passReqToCallback : true }, function(req, email, password, done) { // check in mongo if a user with username exists or not User.findOne({ 'email' : email }, function(err, user) { // In case of any error, return using the done method if (err) return done(err); // Username does not exist, log the error and redirect back if (!user){ console.log('User Not Found with email '+email); return done(null, false, req.flash('message', 'User Not found.')); } // User exists but wrong password, log the error if (!isValidPassword(user, password)){ console.log('Invalid Password'); return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page } // User and password both match, return user from done method // which will be treated like success return done(null, user); }); })); var isValidPassword = function(user, password){ return bCrypt.compareSync(password, user.password); } }
Quel est le problème?
En fait, mon problème était un caractère invisible, qui me redirigeait vers une autre page, ce qui a ensuite causé un tas d’autres problèmes.