2012-08-04 110 views
4

服務器代碼:socket.io客戶端無法獲得授權失敗的原因

//run with node-dev server.js 
var remoteServer = io.of('/remote'); 
remoteServer.authorization(function(handshakeData, callback){ 
    return callback('unknown clientType', false); 
} 

服務器日誌:

You can visit your app with http://localhost:3000 
    info - handshake authorized l4FzYiWpHo2d8VeoB3Zo 
    warn - handshake error unknown clientType for /remote 

客戶端代碼:

//run with node-dev client.js 
var io = require('socket.io/node_modules/socket.io-client'); 
var client = io.connect('http://localhost:3000/remote'); 
client.on('connect_failed', function(reason){ 
    console.log('connect_failed:', reason); 
}); 

//will call this because it's Namespace authorization 
client.on('error', function(reason){ 
    console.log('error:', reason); 
}); 

客戶端日誌:

//error reason miss. 
E:\Workspace\TZ\SmartDoor\client>node-dev client.js 
error: 
+0

閱讀後src和測試,發現授權不允許自定義錯誤味精,只有回調(空,假的),然後客戶端有:「錯誤:未授權」 – atian25 2012-08-04 10:00:09

+0

現在,我應該刪除這個問題還是近?哪個操作 – atian25 2012-08-04 10:01:53

+0

那麼我怎麼能告訴客戶端授權更多細節失敗msg? – atian25 2012-08-04 10:05:58

回答

1

在Socket.IO authorization中間件基於HTTP頭的數據來處理的握手過程即在WebSocket的情況下與第一個HTTP交換協議頭一起發送。

此數據包含正常的頭的東西,以及餅乾和用於有時恢復會話。
雖然authorization中間件發生之前實際的WebSockets握手過程已經完成,而這個中間件不應該被用於應用程序邏輯的授權,但僅限於網絡和HTTP的東西(如餅乾恢復會話,禁止IP等)。因爲它實際上是協議特定的(Socket.IO使用許多協議和通信層,例如WebSockets,XHR Long Polling,AJAX等),所以我會推薦不使用這個中間件來實現應用程序邏輯。但是在連接成功建立之後請確認你的驗證邏輯。