套接字上的身份验证方法

时间:2014-01-28 19:08:43

标签: node.js sockets socket.io sails.js passport.js

我正在尝试使用sailsjspassport对套接字进行身份验证。

挑战似乎是套接字连接没有会话,并且sailsjs模拟了一个请求对象,导致它没有Passport中间件设置。这导致nodejs抛出错误,称req对象没有名为logIn的方法。

所以,我已经尝试按照@xdissent here Sails.js + Passport.js authentication through 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 个答案:

答案 0 :(得分:8)

感谢Kasper Isager,不久的将来会有sails.js的护照生成器(Sails.js Version 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

相关问题