passport.js不适用于sails套接字环境

我认为passport.js是一个了不起的框架。 不幸的是,似乎是不支持套接字。 为什么我说这是Sails框架提供的http和socket。 当用户通过passport.js连接sails的服务时,没关系。 通过套接字访问会导致错误。 因为套接字可能不支持中间件?

无论如何,这个问题,我不知道怎么套用passport.js。 给我build议好的想法来呼吸。

事实上,websocket请求不会通过护照中间件,但可以使用解决方法。 你正在使用这艘帆船护照发电机 ?

我将这段代码添加到护照策略中,以将护照方法添加到套接字请求中。

/** Content not generated BEGIN */ var http = require('http') , methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated']; /** Content not generated END */ module.exports = function (req, res, next) { // Initialize Passport passport.initialize()(req, res, function () { // Use the built-in sessions passport.session()(req, res, function () { // Make the user available throughout the frontend res.locals.user = req.user; /** Content not generated BEGIN */ // Make the passport methods available for websocket requests if (req.isSocket) { for (var i = 0; i < methods.length; i++) { req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req); } } /** Content not generated END */ next(); }); }); }; 

Alexis给出了正确的答案…我认为这是Mike推荐的方式,关于这个消息: https : //stackoverflow.com/a/17793954/6793876

只需在config / http.js中删除护照的提及,制定新策略passportMiddleware.js,内容如下:

  //passportMiddleware.js var passport = require('passport'); var http = require('http'); module.exports = function (req, res, next) { // Initialize Passport passport.initialize()(req, res, function () { // Use the built-in sessions passport.session()(req, res, function () { res.locals.user = req.user; var methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated']; if (req.isSocket) { for (var i = 0; i < methods.length; i++) { req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req); } } next(); }); }); }; 

最后,将这个策略添加到所有控制器中,在policies.js中:

 module.exports.policies = { RabbitController: { nurture : ['passportMiddleware','isRabbitMother'], feed : ['passportMiddleware','isNiceToAnimals', 'hasRabbitFood'] } };