Методы аутентификации через сокеты

Я пытаюсь получить аутентификацию, работающую над сокетами с sailsjs и passport.

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

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

Я тоже смотрел в redis. Вот что из этого вышло:--7-->

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>

таким образом, есть сеанс, просто нет пользователя, хранящегося в нем.

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

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

1 ответов


спасибо Каспер Isager будет генератор паспорта для парусов.js в ближайшем будущем (паруса.с JS версии 0.10).

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

api / услуги / паспорт.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;

api / политики / паспорт.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();
    });
  });

};

конфиг/политика.js

module.exports.policies = {

    '*': [ 'passport' ],

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

};

это сделает методы запроса паспорта (логин, так далее.) доступный в запросах гнезда также.

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

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

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

конфиг/розетки.js

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

если вы хотите увидеть полную реализацию Kaspers, проверьте его репозиторий: паруса-генерировать-auth