Подтвердить что ты не робот

Ошибка локального возврата паспорта 400 с плохим запросом с Angular

Я пытаюсь интегрировать паспорт в мою форму входа в систему. Клиентская сторона, вызывающая серверную сторону, работает так, как должна, до тех пор, пока я не вызову pass.authenticate в запросе, 400 Bad Request был возвращен. Что мне здесь не хватает.

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)
});
4b9b3361

Ответ 1

Неверный запрос был брошен паспортом за отсутствие доступа к имени пользователя и паролю.

Это проверка запроса тела и URL для полей username и password. Если это ложь, запрос отклоняется со статусом 400.

При создании LocalStrategy вы можете передать множество опций в дополнительном аргументе для конструктора, выбирая по-разному именованные поля с помощью опций usernameField и/или passwordField. В вашем конкретном случае это будет выглядеть так:

passport.use(new LocalStrategy(
    {usernameField:"user-email", passwordField:"user-password"},
    function(username, password, done) {
        return done(null, false, {message:'Unable to login'})
    }
));

Ответ 2

В моем случае (Express 4.0) я не использовал body-parser

Ответ 3

Эта ошибка также связана с попыткой доступа к элементам HTML DOM без использования body-parser

body-parser - это модуль, который позволяет вам перемещаться по дереву документов html, чтобы читать ответ, особенно в случае полей ввода

Использование -

var parser = require('body-parser');
var urlencodedParser = parser.urlencoded({extended : false});


    app.post("/authenticate", urlencodedParser, passport.authenticate('local'), function (request, response)
    {           
        response.redirect('/');                      
    });

Ответ 4

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);
        });
    }
));