2013-10-23 45 views
7

我已經衝過本教程:http://howtonode.org/socket-io-auth。 它顯示瞭如何使用express和socket.io來驗證用戶。 但是有沒有一種方法來驗證用戶只使用socket.io而不需要明示?使用socket.io進行用戶驗證

編輯:

對於會話處理我用RedisStore(https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO)。 剩下的是創建身份驗證Cookie的模塊。 有誰知道一個socket.io實現我可以用來創建一個身份驗證cookie,就像你可以使用會話處理一樣嗎?

+0

您是否將Socket.IO作爲獨立使用?驗證器不會創建cookie,只是將它們傳遞給Socket.IO。 – hexacyanide

+0

@hexacyanide目前我正在使用express和socket.io。 Express僅創建auth cookie。我不使用它的路由,中間件.... express和socket.io之間的Session與connect-redis共享。我認爲這是一種太大的依賴性,只能使用express來簽署cookie。所以我正在尋找一個不依賴快遞(連接)的解決方案。我可以實現我自己的未經測試和不安全的認證程序,但像Golo Roden認爲這不是可取的。 – bekite

+0

換句話說,你想要一個在基本HTTP服務器上運行的實現?因爲如果你不想完全使用HTTP服務器,那麼你想使用cookie嗎? – hexacyanide

回答

9

我知道這有點舊了,但對於未來的讀者,除了解析cookie並從存儲中檢索會話(例如,passport.socketio)之外,您還可以考慮基於標記的方法。

在這個例子中,我使用了非常標準的JSON Web Tokens。你必須給到客戶端頁面的標記,在這個例子中想象返回JWT認證端點:

var socketioJwt = require('socketio-jwt'); 

var sio = socketIo.listen(server); 

sio.set('authorization', socketioJwt.authorize({ 
    secret: jwtSecret, 
    handshake: true 
})); 

sio.sockets 
    .on('connection', function (socket) { 
    console.log(socket.handshake.decoded_token.email, 'has joined'); 
    //socket.on('event'); 
    }); 

的:

var jwt = require('jsonwebtoken'); 
// other requires 

app.post('/login', function (req, res) { 

    // TODO: validate the actual user user 
    var profile = { 
    first_name: 'John', 
    last_name: 'Doe', 
    email: '[email protected]', 
    id: 123 
    }; 

    // we are sending the profile in the token 
    var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 }); 

    res.json({token: token}); 
}); 

現在,您socket.io服務器可以配置如下socket.io,智威湯遜中間件預計在查詢字符串令牌,因此從客戶端你只需要連接它連接時:

var socket = io.connect('', { 
    query: 'token=' + token 
}); 

我寫了這個甲基更詳細的解釋od和cookies here

+1

那麼對於這個,令牌不會像會話一樣使用?如在,令牌不存儲在除客戶端以外的任何地方?是否使用祕密解碼令牌(在安全性方面)與在會話存儲中使用令牌作爲會話ID相同?我只是試圖圍繞這種基於令牌的方法的好處。 – funseiki

+0

@JoséF. Romaniello雖然我要求一個基於cookie的認證,但我會接受你的答案。當時在2013年,我認爲曲奇是順其自然的。讀完你的文章(和auth0上的其他一些文章)後,我會給出一些嘗試。 – bekite

3

取而代之的還是手動配置身份驗證和會話處理代碼,我建議使用專用模塊,例如session.socket.io(但請注意,這是一個需要Express的模塊)。

我猜(但不知道)有downvotes,因爲你需要某種類型的會話處理,並且你很可能不想手動執行此操作;-)。因此,在這裏堅持使用Express是一個不錯的主意。

不過,這是一個有趣的問題,雖然我無法回答如何在沒有Express的情況下做到這一點。

+0

我使用RedisStore。在https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO上找到它。 – bekite

1

我對node.js很早就剛剛開始。我只能回答第一部分提到的問題,即不使用快遞的用戶身份驗證。我也沒有會話風格的處理。
我仍然回答這個問題的原因是,幫助其他剛開始使用更簡單的替代解決方案的人。

我目前在我的學習項目中使用的解決方案(基於socket.io的聊天,還有什麼?)使用http服務器進行身份驗證。
如果您無法在http服務器上獲得有效的身份驗證,則永遠無法訪問帶有socket.io界面的頁面。

http服務器上的用戶身份驗證通過讀取某些POST數據來處理。只有當POST數據是有效的用戶數據時,用戶才允許移動到socket.io界面所在的聊天室。