[英]Authentication with Node/Express/Socket.IO
我有一個連接到HTML文件的node / socket.io / express服務器( 如此 )。 因此,訪問Web地址會將您連接到服務器。 我正在嘗試建立一個系統,其中,服務器一次在多台計算機上運行,並通過某種用戶名和密碼身份驗證,訪問具有特定憑據的網頁將您連接到具有相同權限的計算機之一運行服務器的憑據。
我見過以前類似的問題提到“Redis”,但它們已經很老了,我想知道是否有更新或更好的方法來實現這一點。
你不會找到很多最新的文檔,因為Express 4是一種新的,所以讓我試着在這里解決這個問題:
讓我們從一個混亂開始,我認為你正在制造:
什么是Redis?
Redis是一個數據結構引擎。 它允許您存儲鍵/值對,僅此而已(在此上下文中)。 在構建身份驗證系統時,它唯一能為您做的就是存儲數據,用戶信息,會話ID等。在您的情況下,您可以在多台計算機之間共享存儲,就像共享數據庫一樣,或者一個文本文件。
驗證用戶到節點/快速服務器
其中一種方法是使用護照 。 Passport是一個專門用於Node.js身份驗證的中間件。 它適用於Express,相對容易設置。 有一個關於如何使用快遞應用程序設置護照的優秀教程系列 ,所以我不會詳細介紹這一部分,請花時間閱讀系列,這是非常寶貴的知識。
將socket.io添加到混合中
Socket.io無權訪問您在第1部分中創建的會話cookie。為了解決這個問題,我們將使用passport-socketio模塊。
Passport-socketio需要本地會話存儲,而不是內存存儲。 這意味着我們需要某種方式將會話數據存儲在某個地方,這是否會響鈴?
確切地說, Redis 。
您可以嘗試其他商店,如mongoDB或MySQL,但Redis是最快的。
在這個例子中,我假設你的快遞應用程序和護照已經運行,並將專注於將socket.io添加到應用程序。
設定 :
var session = require('express-session'); //You should already have this line in your app
var passportSocketIo = require("passport.socketio");
var io = require("socket.io")(server);
var RedisStore = require('connect-redis')(session);
var sessionStore = new RedisStore({ // Create a session Store
host: 'localhost',
port: 6379,
});
app.use(session({
store: sessionStore, //tell express to store session info in the Redis store
secret: 'mysecret'
}));
io.use(passportSocketIo.authorize({ //configure socket.io
cookieParser: cookieParser,
secret: 'mysecret', // make sure it's the same than the one you gave to express
store: sessionStore,
success: onAuthorizeSuccess, // *optional* callback on success
fail: onAuthorizeFail, // *optional* callback on fail/error
}));
Connect-redis是一個使用redis的會話存儲包(如果名稱不明顯)。
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(); //Let the user through
}
function onAuthorizeFail(data, message, error, accept){
if(error) accept(new Error(message));
console.log('failed connection to socket.io:', message);
accept(null, false);
}
io.sockets.on('connection', function(socket) {
console.log(socket.request.user);
});
在socket.request中找到的用戶對象將包含登錄用戶的所有用戶信息,您可以傳遞它,或者從這一點做任何您需要的用戶信息。
注意:對於Socket.IO <1.x,此設置略有不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.