当我在Passport.js中使用Sails.js时,通过websocket请求时,req对象上不存在isAuthenticated方法。
有人能告诉我为什么会这样吗?
答案 0 :(得分:25)
或者,您可以劫持'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();
};
使用此方法,您无需特殊处理即可检查策略中的套接字请求身份验证。您仍然需要通过快速中间件来挂接非套接字请求的护照。
答案 1 :(得分:14)
请尝试检查 req.session.passport.user 。 它将在登录时包含用户信息,否则将不确定。 适用于任何类型的请求。
我认为这是因为在WebSocket请求的情况下,“req”实际上是假请求对象。它创建并直接传递给Express'路由器,绕过所有Express'中间件,包括Passport的一个
答案 2 :(得分:11)
@ataman是完全正确的。使用express.customMiddleware
配置安装的Express中间件仅适用于Express HTTP请求。
要获得所有请求的护照,请在您的政策中使用:
// e.g.
// config/policies.js
module.exports = {
SomeController: {
someaction: function somePassportMiddlewareFn() {}
}
};
答案 3 :(得分:0)
使用护照定义方法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)