Методы проверки подлинности по сокетам

Я пытаюсь выполнить аутентификацию над сокетами с sailsjs и passport.

Кажется, что проблема заключается в том, что соединение сокета не имеет сеанса и что sailsjs издевается над объектом запроса, в результате чего он не имеет установки промежуточного ПО Passport. Это заставило nodejs выдавать ошибку, заявив, что объект req не имеет метода под названием logIn.

Итак, я пробовал следовать фрагменту кода, предоставленному @xdissent здесь: Sails.js + Passport.js аутентификация через websockets, что, действительно, позволяет мне войдите без ошибок. Или это..? Оказывается, он что-то делает, Но я понятия не имею, что. Поскольку после извлечения req.user через другой (сокет) запрос, я получаю пустой объект.

Я тоже посмотрел на redis. Из этого вышло:

redis 127.0.0.1:6379> keys *
1) "waterline:broadcasting:_sequences:id"
2) "sess:aDJI0YHzh17E3AMjtKsZSijs"
redis 127.0.0.1:6379> get "sess:aDJI0YHzh17E3AMjtKsZSijs"
"{\"cookie\":{\"httpOnly\":true,\"path\":\"/\"}}"
redis 127.0.0.1:6379>

Итак, есть сеанс, который не хранится в нем.

Короче говоря, как я могу получить Passport и sailsjs, чтобы играть красиво над сокетами.

Обновление: Мне бы хотелось получить информацию о сеансах, сокетах и ​​файлах cookie с парусами в целом. Поэтому, если я задал материал в сеансе и обновил браузер, я бы хотел, чтобы он все еще был там. Если я делаю вызов xhr на той же странице, что и сокет, не должен ли он быть тем же самым сеансом?

Ответы

Ответ 1

Благодаря Kasper Isager в ближайшем будущем появится паспортный генератор для sails.js(версия Sails.js 0.10).

Он реализует паспорт с использованием политик (промежуточное ПО парусов).

апи/услуги/passport.js

var passport = require('passport');

passport.serializeUser(function(user, next) {
    next(null, user.id);
});

passport.deserializeUser(function(id, next) {
    User.findOne(id).done(next);
});

// Put your Passport config logic here

// Make passport globally available
module.exports = passport;

апи/политика/passport.js

module.exports = function (req, res, next) {

  // Initialize Passport
  passport.initialize()(req, res, function () {
    // Use the built-in sessions
    passport.session()(req, res, function () {
      // Make the user available throughout the frontend
      res.locals.user = req.user;

      next();
    });
  });

};

конфигурации/policies.js

module.exports.policies = {

    '*': [ 'passport' ],

    // MyCustomController: {
    //  update: [
    //      'passport',
    //      'authorize'
    //  ]
    // }

};

Это сделает методы запроса паспорта (logIn и т.д.) доступными также в запросах сокетов.

После успешного входа ваш серверный объект сеанса будет выглядеть следующим образом:

{
    // Express
    cookie: {
        originalMaxAge: null,
        expires: null,
        httpOnly: true,
        path: '/'
    },
    // Passport
    passport: {
        user: '52fc98e108b31348a537fa43' // userId
    }
}

Вы можете получить к нему доступ в любой политике с помощью req.session или даже при обратных вызовах сокета, например:

конфигурации/sockets.js

onConnect: function(session, socket){}
onDisconnect: function(session, socket){}

Если вы хотите, чтобы полная реализация Kaspers проверила его репозиторий: sails-generate-auth