我正在尝试通过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调用,那么这不应该是同一个会话吗?
感谢Kasper Isager,在不久的将来会有sails.js的护照生成器(Sails.js版本0.10).
他使用策略(sails中间件)实现Passport.
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(); }); }); };
配置/ 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