套接字的身份validation方法
我试图通过sailsjs
和passport
获得身份validation工作。
这个挑战似乎是套接字连接没有会话,sailsjs嘲笑请求对象,导致它没有设置Passport中间件。 这导致nodejs抛出一个错误,说req
对象没有一个叫做logIn
的方法。
所以,我试着按照@xdissent在这里提供的代码片断: 通过websockets进行Sails.js + Passport.jsauthentication,这确实可以让我login而不会抛出错误。 或者呢? 事实certificate,它做了什么 ,但我不知道是什么。 因为通过不同的(套接字)请求获取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>
所以有一个会话,只是没有用户存储在它。
所以长话短说,我如何获得护照和sailsjs发挥好套接字。
更新 :我想了解一些关于会话,套接字和一般的风帆的信息。 所以,如果我在一个会话中设置东西,并刷新浏览器,我希望它仍然在那里。 如果我在与套接字连接相同的页面上进行xhr调用,不应该是相同的会话吗?
感谢Kasper Isager在不久的将来会有sails.js的护照生成器(Sails.js Version 0.10)。
他通过使用策略(sails中间件)来实施护照。
API /服务/ 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;
API /政策/ 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(); }); }); };
configuration/ policies.js
module.exports.policies = { '*': [ 'passport' ], // MyCustomController: { // update: [ // 'passport', // 'authorize' // ] // } };
这将使套接字请求中的护照请求方法(logIn等)也可用。
成功login后,您的服务器端会话对象将如下所示:
{ // Express cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' }, // Passport passport: { user: '52fc98e108b31348a537fa43' // userId } }
您可以在req.session
任何策略中访问它,甚至可以在如下的套接字callback中访问它:
configuration/ sockets.js
onConnect: function(session, socket){} onDisconnect: function(session, socket){}
如果你想看看Kaspers的全部实现,请检查他的存储库: sails-generate-auth