Authentification Passport Node.js via le proxy de redirection Apache

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.