Методы аутентификации через сокеты
Я пытаюсь получить аутентификацию, работающую над сокетами с 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