Sails.js + Passport.jsauthentication通过websockets

当我用Passport.js使用Sails.js时,当通过websocket请求req对象时,isAuthenticated方法不存在。

谁能告诉我为什么会发生这种情况?

或者,您可以劫持“router:request”事件以插入套接字请求的通行证。 我在'config / bootstrap.js'中这样做:

module.exports.bootstrap = function (cb) { var passport = require('passport'), initialize = passport.initialize(), session = passport.session(), http = require('http'), methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated']; sails.removeAllListeners('router:request'); sails.on('router:request', function(req, res) { initialize(req, res, function () { session(req, res, function (err) { if (err) { return sails.config[500](500, req, res); } for (var i = 0; i < methods.length; i++) { req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req); } sails.router.route(req, res); }); }); }); cb(); }; 

使用这种方法,您不需要特殊的处理来检查策略中的套接字请求身份validation。 您仍然需要通过Express中间件的方式为非套接字请求挂接护照。

请尝试检查req.session.passport.user 。 它将包含login时的用户信息,否则将被定义。 适用于任何types的请求。

我认为这是因为在发生WebSocket请求的情况下,“req”实际上是假的请求对象。 它创build并直接传递到Express路由器,绕过所有的Express中间件,包括Passport的中间件

@ataman是完全正确的。 使用express.customMiddlewareconfiguration安装的Express中间件仅适用于Express HTTP请求。

要使护照适用于所有请求,请在您的政策中使用:

 // eg // config/policies.js module.exports = { SomeController: { someaction: function somePassportMiddlewareFn() {} } }; 

另一种扩展socket.io req的方法是使用护照定义的方法login,logout,…来重写策略或中间件,如下所示

 module.exports = (req, res, next) -> if req.isSocket req = _.extend req, _.pick(require('http').IncomingMessage.prototype, 'login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated') middleware = passport.authenticate('bearer', { session: false }) middleware(req, res, next)