当我在使用Sails.js和Passport.js时,通过websocket请求时,req对象上不存在isAuthenticated方法。请问这是为什么?
或者,您可以劫持“router:request”事件,为套接字请求插入passport。 我在“config / bootstrap.js”中执行此操作:
或者,您可以劫持“router:request”事件,为套接字请求插入passport。 我在“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();
};
采用这种方法,您无需在策略中特别处理检查套接字请求的身份验证。但是,您仍需要通过Express中间件连接护照以用于非套接字请求。
lib/router
中的README。这在未来版本的Sails中可能会简化-但首先还有一些其他考虑要解决(有关更多信息,请参见[问题#141](https://github.com/balderdashy/sails/pull/1431#issuecomment-35816845))。 - mikermcneil@ataman说得很对。使用express.customMiddleware
配置安装的Express中间件仅适用于Express HTTP请求。
要使护照适用于所有请求,请在您的策略中使用它:
// e.g.
// config/policies.js
module.exports = {
SomeController: {
someaction: function somePassportMiddlewareFn() {}
}
};
另一种扩展带有护照定义的方法login、logout等的socket.io req的方式是按照以下方式重写策略或中间件
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)
lib/router
中常见问题解答的原因: - mikermcneilreturn sails.config[500](500, req, res);
这一行是在做什么?在 Sails 0.10.x 下,现在应该改为return serverError();
吗? - Dave Sag