[Authentication] Socket.IO身份驗證


Answers

我也喜歡pusherapp私人頻道的方式。

生成一個唯一的套接字ID並由Pusher發送給瀏覽器。 這通過AJAX請求發送到您的應用程序(1),該請求授權用戶訪問您的現有認證系統的頻道。 如果您的應用程序成功返回一個授權字符串給您與Pusher秘密簽名的瀏覽器。 這通過WebSocket發送給Pusher,如果授權字符串匹配,則完成授權(2)。

因為socket.io對每個套接字都有唯一的socket_id。

socket.on('connect', function() {
        console.log(socket.transport.sessionid);
});

他們使用簽名授權字符串來授權用戶。

我還沒有把它鏡像到socket.io ,但我認為這可能是一個非常有趣的概念。

Question

我試圖在Node.js中使用Socket.IO,並試圖讓服務器為每個Socket.IO客戶端提供一個身份。 由於套接字代碼超出了http服務器代碼的範圍,因此它無法輕鬆訪問發送的請求信息,因此我假設它將在連接期間發送。 什麼是最好的方式

1)通過Socket.IO向服務器獲取有關誰正在連接的信息

2)驗證他們說他們是誰(我正在使用Express,如果這使得事情變得更容易)




在c / s之間使用會話和redis

// 服務器端

io.use(function(socket, next) {
 console.log(socket.handshake.headers.cookie); // get here session id and match from redis session data
 next();
});



這篇文章( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ )展示瞭如何

  • 在Redis中存儲HTTP服務器的會話(使用Predis)
  • 通過Cookie中發送的會話ID從node.js中獲取來自Redis的這些會話

使用這段代碼,你也可以在socket.io中獲得它們。

var io = require('socket.io').listen(8081);
var cookie = require('cookie');
var redis = require('redis'), client = redis.createClient();
io.sockets.on('connection', function (socket) {
    var cookies = cookie.parse(socket.handshake.headers['cookie']);
    console.log(cookies.PHPSESSID);
    client.get('sessions/' + cookies.PHPSESSID, function(err, reply) {
        console.log(JSON.parse(reply));
    });
});