首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于套接字的身份验证方法

基于套接字的身份验证方法
EN

Stack Overflow用户
提问于 2014-01-29 03:08:43
回答 1查看 2.8K关注 0票数 16

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

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

因此,我试着遵循@xdissent提供的代码片段:Sails.js + Passport.js authentication through websockets,它确实允许我在不抛出错误的情况下登录。还是..?事实证明,它做了一些事情,但我不知道是什么。因为在通过不同的(套接字)请求获取req.user时,我得到一个返回的空对象。

我也查过redis了。这个结果是这样的:

代码语言:javascript
复制
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在套接字上更好地发挥作用。

更新:我想了解一些关于会话、套接字和带有sails的cookie的信息。因此,如果我在会话中设置内容,并刷新浏览器,我希望它仍然在那里。如果我在与套接字连接相同的页面上进行xhr调用,那么这不应该是同一个会话吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-12 21:51:18

多亏了Kasper Isager,在不久的将来将会有一个用于sails.js的passport生成器(Sails.js版本0.10)。

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

api/services/passport.js

代码语言:javascript
复制
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;

接口/策略/passport.js

代码语言:javascript
复制
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

代码语言:javascript
复制
module.exports.policies = {

    '*': [ 'passport' ],

    // MyCustomController: {
    //  update: [
    //      'passport',
    //      'authorize'
    //  ]
    // }

};

这将使passport请求方法(logIn等)在套接字请求中也可用。

成功登录后,您的服务器端会话对象将如下所示:

代码语言:javascript
复制
{
    // Express
    cookie: {
        originalMaxAge: null,
        expires: null,
        httpOnly: true,
        path: '/'
    },
    // Passport
    passport: {
        user: '52fc98e108b31348a537fa43' // userId
    }
}

您可以使用req.session在任何策略中访问它,甚至可以在套接字回调中访问它,如:

config/sockets.js

代码语言:javascript
复制
onConnect: function(session, socket){}
onDisconnect: function(session, socket){}

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21414610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档