web-dev-qa-db-fra.com

Passport local renvoie l'erreur 400 demande incorrecte avec Angular

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)
});
18
Gene Lim

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'})
    }
));
42
cepharum

Dans mon cas (Express 4.0), je n'utilisais pas body-parser

11
Jeff Hoye

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('/');                      
    });
6
Vandana Sharma
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);
        });
    }
));
0
LekhRazz Rokaya