Когда я использую Sails.js с Passport.js, метод isAuthenticated не существует в объекте req при запросе через websocket.
Может ли кто-нибудь сказать мне, почему это происходит?
Когда я использую Sails.js с Passport.js, метод isAuthenticated не существует в объекте req при запросе через websocket.
Может ли кто-нибудь сказать мне, почему это происходит?
В качестве альтернативы вы можете захватить событие "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();
};
При таком подходе вам не нужна специальная обработка для проверки подлинности запроса на сокет в политиках. Вам все равно нужно подключить паспорт для запросов без сокетов посредством прямого промежуточного программного обеспечения.
Попробуйте проверить req.session.passport.user. Он будет содержать информацию о пользователе при входе в систему и будет undefined в противном случае. Работает для меня с любым типом запроса.
Я думаю, что это происходит, потому что в случае запроса WebSocket "req" на самом деле является поддельным объектом запроса. Он был создан и передан непосредственно маршрутизатору Express'а, минуя все промежуточное ПО Express, включая Passport one
@ataman точно прав. Быстрое промежуточное программное обеспечение, которое вы устанавливаете с помощью конфигурации express.customMiddleware
, применяется только к запросам экспресс-HTTP.
Чтобы получить паспорт для работы по всем запросам, используйте его в своих правилах:
// e.g.
// config/policies.js
module.exports = {
SomeController: {
someaction: function somePassportMiddlewareFn() {}
}
};
Еще один способ расширить 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)