Подтвердить что ты не робот

Проверка подлинности Sails.js + Passport.js через websockets

Когда я использую Sails.js с Passport.js, метод isAuthenticated не существует в объекте req при запросе через websocket.

Может ли кто-нибудь сказать мне, почему это происходит?

4b9b3361

Ответ 1

В качестве альтернативы вы можете захватить событие "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();
};

При таком подходе вам не нужна специальная обработка для проверки подлинности запроса на сокет в политиках. Вам все равно нужно подключить паспорт для запросов без сокетов посредством прямого промежуточного программного обеспечения.

Ответ 2

Попробуйте проверить req.session.passport.user. Он будет содержать информацию о пользователе при входе в систему и будет undefined в противном случае. Работает для меня с любым типом запроса.

Я думаю, что это происходит, потому что в случае запроса WebSocket "req" на самом деле является поддельным объектом запроса. Он был создан и передан непосредственно маршрутизатору Express'а, минуя все промежуточное ПО Express, включая Passport one

Ответ 3

@ataman точно прав. Быстрое промежуточное программное обеспечение, которое вы устанавливаете с помощью конфигурации express.customMiddleware, применяется только к запросам экспресс-HTTP.

Чтобы получить паспорт для работы по всем запросам, используйте его в своих правилах:

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

Ответ 4

Еще один способ расширить 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)