J'essaie d'intégrer un passeport au formulaire de connexion de mon code. Le côté serveur côté client d’appel fonctionne comme il se doit jusqu’à ce que j’appelle passport.authenticate dans la demande, 400 demandes incorrectes ont été renvoyées. Qu'est-ce que j'oublie ici.
HTML
<div>
<div class="row">
<div class="input-field col s12">
<input id="user-email" type="text" ng-model="user.email">
<label for="user-email">Your email address</label>
</div>
</div>
<div class="row">
<div class="input-field col s12">
<input id="user-password" type="password" ng-model="user.password">
<label for="user-password">Your password</label>
</div>
</div>
<div id="login-button-panel" class="center-align">
<button class="btn" id="login-btn" ng-click="vm.login(user);">Login</button>
</div>
<div class="section center">
<a class="modal-trigger">Forgot password?</a>
</div>
</div>
JS
$http.post('/api/login',user).success(function(result){
console.log(result)
})
server.js
passport.use(new LocalStrategy(
function(username, password, done) {
return done(null, false, {message:'Unable to login'})
}
));
passport.serializeUser(function(user,done){
done(null,user);
});
passport.deserializeUser(function(user,done){
done(null,user);
});
app.post('/api/login', passport.authenticate('local'), function(req,res){
res.json(req.user)
});
Bad Request a été jeté par passeport pour l'accès manquant sur le nom d'utilisateur et le mot de passe.
Il vérifie le corps et la requête d'URL pour les champs username
et password
. S'il s'agit de falsy, la demande est rejetée avec le statut 400.
Lors de la création de votre LocalStrategy, vous pouvez transmettre un ensemble d’options en argument supplémentaire au constructeur choisissant des champs portant un nom différent à l’aide des options usernameField
et/ou passwordField
. Dans votre cas particulier, cela ressemblerait à ceci:
passport.use(new LocalStrategy(
{usernameField:"user-email", passwordField:"user-password"},
function(username, password, done) {
return done(null, false, {message:'Unable to login'})
}
));
Dans mon cas (Express 4.0), je n'utilisais pas body-parser
Cette erreur provient également d'une tentative d'accès aux éléments HTML DOM sans utiliser body-parser
body-parser est un module qui vous permet de parcourir l'arborescence du document HTML pour lire la réponse, en particulier dans le cas de champs de saisie
Utilisation -
var parser = require('body-parser');
var urlencodedParser = parser.urlencoded({extended : false});
app.post("/authenticate", urlencodedParser, passport.authenticate('local'), function (request, response)
{
response.redirect('/');
});
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password'
},
function (email, password, done) {
db.collection('User').findOne({ email: email }, async function (err, user) {
console.log('user requested password caught in passport', password);
if (err) { return done(err); }
if (!user) { return done(null, false); }
const matchPassword = await comparePassword(password, user.password);
if (!matchPassword) { return done(null, false); }
return done(null, user);
});
}
));