2015-07-12 50 views
1

我認爲passport.js是一個了不起的框架。不幸的是,它似乎不支持套接字。爲什麼我說這是Sails框架提供的http和套接字。當用戶通過passport.js連接sails的服務時,無關緊要。通過套接字訪問會導致錯誤。由於套接字可能不支持中間件?passport.js不適用於風帆套接字環境

無論如何,ciritical的問題,我不知道如何在套接字上應用passport.js。給我建議好的想法來呼吸。

回答

1

事實上,websocket請求不會通過護照中間件,但可以使用解決方法。你使用這個sails passport generator

我將此代碼添加到護照策略中,以將護照方法添加到套接字請求中。

/** 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(); 
    }); 
    }); 
}; 
+0

你的代碼在我搜索的內容中是最好的。 –

0

亞歷克西斯給了正確的答案......我認爲這是由Mike建議報告的方式,對此消息:https://stackoverflow.com/a/17793954/6793876

只要刪除護照在配置/ http.js提到,結交新政策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'] 
    } 
}; 
相關問題