2014-01-28 89 views
16

我試圖通過sailsjspassport套接字來獲得身份驗證工作。套接字身份驗證方法

這個挑戰似乎是套接字連接沒有會話,sailsjs嘲笑請求對象,導致它沒有安裝Passport中間件。這導致nodejs發出錯誤,說req對象沒有一個名爲logIn的方法。

所以,我試着按照@xdissent在這裏提供的代碼片段:Sails.js + Passport.js authentication through 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以便在套接字上播放更多內容。

更新: 我想了解一些有關會議,套接字和餅乾與帆一般信息。所以如果我在會話中設置了一些東西,並刷新瀏覽器,我希望它仍然在那裏。如果我在與套接字連接相同的頁面上進行xhr調用,是不是應該是同一個會話?

+0

upvoting這是它的,我已經沒有搞清楚一個答案一個很好的問題。 – gorelative

+0

+1您是否已經找到解決方案? – HaNdTriX

+0

你有沒有試過https://github.com/jfromaniello/passport.socketio –

回答

8

感謝Kasper Isager在不久的將來會有sails.js的護照生成器(Sails.js版本0.10)。

他通過使用策略(sails中間件)實施護照。

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甚至在插座回調像訪問任何政策。JS

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

如果你想看到的Kaspers全面落實檢查了他的倉庫: sails-generate-auth

+1

我可能會誤解護照是如何工作的,但是不應該在服務中執行「passport.serializeUser」和反序列化操作?否則我們會在每個請求中重新聲明(de)序列化函數? – Hudon

+1

感謝您與大家分享(當然,感謝Kasper)。這很好。 – mikermcneil

+0

@Hudon是的,我想你是對的。兩者都有效,但是你的方式更好,因爲''serializeUser'''和''''''''''''''''''''''' – HaNdTriX