Passport.js不能在风帆插座环境下工作

passport.js doesn't work on sails socket environment

本文关键字:环境 工作 插座 风帆 js 不能 Passport      更新时间:2023-09-26

我认为passport.js是一个了不起的框架。然而,不幸的是,它似乎不支持socket。我之所以这么说,是因为Sails框架提供了http和套接字。当用户通过passport.js连接sails服务时,这无关紧要。通过套接字访问出错。因为socket可能不支持中间件?

不管怎样,关键的问题是,我不知道如何在socket上应用passport.js

确实,websocket请求不传递护照中间件,但可以使用变通方法。您正在使用这个航海护照生成器吗?

我将此代码添加到护照策略中,以便向套接字请求添加护照方法。

/** Content not generated BEGIN */
var http = require('http')
  , methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated'];
/** Content not generated END */
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;
      /** Content not generated BEGIN */
      // Make the passport methods available for websocket requests
      if (req.isSocket) {
        for (var i = 0; i < methods.length; i++) {
          req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req);
        }
      }
      /** Content not generated END */
      next();
    });
  });
};

Alexis给出了正确的答案…我认为这是Mike建议的方式,关于这条消息:https://stackoverflow.com/a/17793954/6793876

在config/http.js中删除passport的提及,用以下内容创建新的策略passportMiddleware.js:

    //passportMiddleware.js
    var passport = require('passport');
    var http = require('http');
    module.exports = function (req, res, next) {
      // Initialize Passport
      passport.initialize()(req, res, function () {
        // Use the built-in sessions
        passport.session()(req, res, function () {
            res.locals.user = req.user;
            var methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated'];
            if (req.isSocket) {
                for (var i = 0; i < methods.length; i++) {
                  req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req);
                }
            }
          next();
        });
      });
    };

最后将此策略添加到所有控制器中,在policies.js:

module.exports.policies = {
    RabbitController: {
        nurture : ['passportMiddleware','isRabbitMother'],
        feed : ['passportMiddleware','isNiceToAnimals', 'hasRabbitFood']
    }
};