2016-10-19 57 views
4

我试图通过护照http包的帮助来保护我的风帆js rest api,但此刻我无法弄清楚错误在我的代码中。 我用这个repo和这个tutorial来了解这应该如何工作。我的问题是,我的代码总是返回一个401. 我真的不知道在哪里寻找错误。如果您需要更多关于我的代码的信息,请点评。 布鲁诺Sails JS护照http 401

编辑: 我找到了问题的根源(随着@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

尝试使用“基本”,而不是用户认证 –

+0

好,不过我想我可以说出不同的策略 – Bruno

+0

https://开头github上。com/jaredhanson /护照-http我希望这会帮助你 –

回答

0

对我的作品 - 我能,以及认证的访问和管理用户数据,一旦有数据库的有效用户。对于空的用户数据库,您当然会一直得到401,因为这些策略不允许您创建第一个用户进行身份验证。暂时禁用config/policies.js中的UserController政策可让您有机会创建第一个用户。

假设您在数据库中至少有一个有效用户,让我们缩小这个问题。你在isAuthenticated.js的日志记录erruser中得到了什么输出?如果获得nullfalsepassport.js的不同步骤会发生什么 - 您是否能够通过数据库中的电子邮件地址找到用户,并且密码是否匹配?

您是否有自定义路线和控制器操作,或者您是否使用蓝图?

编辑:您更新的测试看起来像这样用HTTP基本身份验证:

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为空,并且用户为false(如你所建议的)。信息说'基本领域=“用户”'。最让我困惑的是每当我尝试在'passport.use('user-authentication',...'函数内部记录一些东西时,什么都不会发生,我使用自定义路由,并且会发布我的测试函数。 ..可能我在那里有一个错误... – Bruno

+0

@Bruno你有一个用户在数据库中登录为? – Viktor

+0

是的,我确实有,我改变了政策,所以总是可以创建新的用户 – Bruno

0

从它表明你需要用户名和密码的文档here。所以看着你的代码,你有邮件代替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