套接字上的身份验证方法

 放开丶那手 发布于 2023-01-30 18:22

我正在尝试通过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调用,那么这不应该是同一个会话吗?

1 个回答
  • 感谢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

    2023-01-30 18:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有