2016-10-19 2 views
4

Я пытаюсь защитить свои паруса js rest api с помощью паспорта http-пакета, но на данный момент я не могу понять, где ошибка в моем коде. Я использовал этот repo и этот tutorial, чтобы понять, как это должно работать. Моя проблема в том, что мой код всегда возвращает 401. Я действительно не знаю, где искать ошибку. Если вам нужна дополнительная информация о моем коде, просто комментируйте. BrunoПарус JS паспорт http 401

EDIT: я нашел источник проблемы (с помощью @Viktor). Я просто не понял, как работает аутентификация HTTP-Basic. Теперь проблема в том, как я могу отправить свои учетные данные и мои данные? Если я просто тестирую маршруты с помощью auth (...), они работают ... Но как я могу добавить данные? Или мне нужно сначала аутентифицировать меня и отправить данные во второй запрос?

passport.js

var passport = require('passport'); 
var BasicStrategy = require('passport-http').BasicStrategy; 
var bcrypt = require('bcrypt'); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findOne({ 
    id: id 
    }, function(err, user) { 
    done(err, user); 
    }); 
}); 

passport.use('user-authentication', new BasicStrategy(
    function(mail, password, done) { 
    sails.log.error("hallo"); 
    User.findOne({ 
     mail: mail 
    }, function(err, user) { 
     if (err) { 
     return done(err); 
     } 

     if (!user) { 
     return done(null, false, { 
      message: 'Incorrect email.' 
     }); 
     } 

     // Make sure the password is correct 
     bcrypt.compare(password, user.password, function(err, isMatch) { 
     if (err) { 
      return done(err); 
     } 

     // Password did not match 
     if (!isMatch) { 
      return done(null, false, { 
      message: 'Invalid Password' 
      }); 
     } 

     // Success 
     return done(null, user); 
     }); 
    }); 
    } 
)); 

isAuthenticated.js

var passport = require("passport"); 


module.exports = function (req, res, ok) { 
    passport.authenticate("user-authentication", { 
     session: false 
    }, function (err, user, info) { 
     if (err || !user) { 
      res.set("WWW-Authenticate", "Basic realm=\"Restricted\""); 

      return res.send("You are not permitted to perform this action", 401); 
     } 

     req.session.user = user; 
     return ok(null, user); 

    })(req, res, ok); 
}; 

policies.js

module.exports.policies = { 
    '*': true, 

    'UserController': { 
    update: 'isAuthenticated' 
    } 
} 

UserController.test.js

var request = require('supertest'); 
var async = require('async'); 

describe('UserController', function() { 

    describe('#new()', function() { 
    it('...', function (done) { 
     request(sails.hooks.http.app) 
     .post('/user/new') 
     .send({ own_number: '654122', password: 'test', mail: '[email protected]', device_id: '1234', numbers: [1234567] }) 
     .expect(200) 
     .end(done); 
    }); 
    }); 

    describe('#update()', function(){ 
    it('...', function (done) { 
     async.series([ 

     function(callback){ 
      request(sails.hooks.http.app) 
      .post('/contact/update') 
      .send({ number: 1234, mail: "[email protected]", password: "test" }) 
      .expect(200) 
      .end(callback); 
     }, 

     function(callback){ 
      request(sails.hooks.http.app) 
      .post('/user/update') 
      .send({ numbers: [1234], mail: "[email protected]", password: "test" }) 
      .expect(200) 
      .end(callback); 
     } 
     ], done); 
    }); 
    }); 

}); 
+0

Попробуйте использовать "Basic" вместо пользователя-аутентификации –

+0

Ok, но я думал, что я могу назвать различные стратегии – Bruno

+0

https: // GitHub.com/jaredhanson/passport-http Я надеюсь, что это поможет вам –

ответ

0

работает для меня - я в состоянии проверить подлинность, а также доступа и управления данными пользователя, как только есть действительный пользователь в базе данных. С пустой пользовательской базой данных вы все равно получите 401, так как эти политики не позволяют создавать даже первого пользователя для аутентификации. Временное отключение политики UserController в config/policies.js дает вам возможность создать первого пользователя.

Предполагая, что у вас есть хотя бы один действительный пользователь в базе данных, давайте сузить проблему. Какой выход вы получаете от регистрации err и user в isAuthenticated.js? Если вы получите и false, что происходит на разных этапах в passport.js - сможете ли вы найти пользователя по электронной почте в базе данных и соответствует ли пароль?

У вас есть пользовательские маршруты и действия контроллера или вы используете чертежи?

EDIT: Ваш тест обновление будет выглядеть следующим образом с HTTP Basic Authentication:

describe('#update()', function(){ 
    it('...', function (done) { 
    async.series([ 

     function(callback){ 
     request(sails.hooks.http.app) 
     .post('/contact/update') 
     .auth('[email protected]', 'test') 
     .send({ number: 1234, mail: "[email protected]", password: "test" }) 
     .expect(200) 
     .end(callback); 
     }, 

     function(callback){ 
     request(sails.hooks.http.app) 
     .post('/user/update') 
     .auth('[email protected]', 'test') 
     .send({ numbers: [1234], mail: "[email protected]", password: "test" }) 
     .expect(200) 
     .end(callback); 
     } 
    ], done); 
    }); 
}); 
+0

err is null, а пользователь является ложным (как вы предложили). Info говорит «Basic Realm =« Пользователи ». Меня больше всего смущает то, что каждый раз, когда я пытаюсь зарегистрировать что-то внутри 'passport.use (« аутентификация пользователя », ...' ничего не происходит, я использую настраиваемые маршруты, и я буду публиковать свои тестовые функции. .. Вероятно, у меня есть ошибка ... – Bruno

+0

@Bruno И у вас есть пользователь в базе данных для входа? – Viktor

+0

Да, у меня есть и я изменил политики, чтобы новый пользователь всегда мог быть создан – Bruno

0

Из документации here это показывает, что вам нужно USERID и пароль. Поэтому, глядя на ваш код, у вас есть почта вместо userid, и именно поэтому вы получаете 401 или, по крайней мере, там, где вы можете начать искать. Если вам нужно проверить это, вы можете посмотреть passport-http basic strategy here.

passport.use(new BasicStrategy( function(userid, password, done) { User.findOne({ mail: userid, password: password }, function (err, user) { done(err, user); }); } ));

+0

что ничего не меняет ... – Bruno

Смежные вопросы