通过套接字的身份验证方法

Posted

技术标签:

【中文标题】通过套接字的身份验证方法【英文标题】:Authentication methods over sockets 【发布时间】:2014-02-20 06:48:39 【问题描述】:

我正在尝试通过带有sailsjspassport 的套接字进行身份验证。

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

所以,我尝试按照@xdissent 提供的代码 sn-p 在这里:Sails.js + Passport.js authentication through websockets 这确实允许我登录而不会引发错误。或者它..?事实证明它做了something,但我不知道是什么。因为在通过不同的(套接字)请求获取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 您是否已经找到解决问题的方法? 你试过github.com/jfromaniello/passport.socketio 你实现serializeUser和deserializeUser了吗? @Jason Nichols passport.socketio 不会实现 Wesley 要求的护照请求方法。 【参考方案1】:

感谢Kasper Isager,在不久的将来会有一个用于sails.js 的护照生成器(Sails.js 版本 0.10)。

他通过使用策略(sails 中间件)来实现 Passport。

api/services/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/policies/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();
    );
  );

;

config/policies.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 在任何策略中访问它,甚至可以在套接字回调中访问它,例如:

config/sockets.js

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

如果您想查看 Kaspers 的完整实现,请查看他的存储库: sails-generate-auth

【讨论】:

我可能误解了护照的工作原理,但passport.serializeUser 和反序列化不应该在服务中完成吗?否则我们会在每次请求时重新声明(反)序列化函数? 感谢大家分享(当然也感谢 Kasper)。这太棒了。 @Hudon 是的,我想你是对的。两者都有效,但您的方式更好,因为 serializeUserdeserializeUser 仅初始化一次。 此方法(不是生成)是否适用于 0.9.x? 按照此操作并以相同的方式设置所有内容。我逐步确保政策正在运行,但我得到了TypeError: Object #<Object> has no method 'logIn'

以上是关于通过套接字的身份验证方法的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 中的身份验证

我可以通过身份验证与 HAProxy 和 socket.io 进行粘性会话吗?

在 Python 中为 dovecot 创建一个基于 Unix 套接字的身份验证服务器

Nodejs,Cloud Firestore上传任务 - 身份验证错误:错误:套接字挂起

在没有弹簧身份验证的情况下通过 web-socket 多次回复

使用 Stripe 订阅 Node.js 进行身份验证