2013-10-02 61 views
0

如何使用Node.js我一直在「玩」與認證,表達和socket.io什麼是授權使用Node.js和受Socket.io

我已經試過這裏的例子http://howtonode.org/socket-io-auth

最好的方法
app.use(express.cookieParser("rocks")); 
app.use(express.session()); 

io.set('authorization', function(handshakeData, accept) { 
    console.log('in authorization'); 
    if(handshakeData.headers.cookie) { 
      handshakeData.cookie = cookie.parse(handshakeData.headers.cookie); 
      handshakeData.sessionID = connect.utils.parseSignedCookie(handshakeData.cookie['express.sid']); 
      if (handshakeData.cookie['express.sid'] == handshakeData.sessionID) { 
        return accept('Cookie is invalid.', false); 
      } 
    } else { 
      return accept('No cookie transmitted.', false); 
    } 
    accept(null, true); 
}); 

我不斷收到的連接,更具體該調用線產生的錯誤

connect.utils.parseSignedCookie(handshakeData.cookie['express.sid']); 

/workspace/node_modules/connect/node_modules/cookie-signature/index.js:39 
if ('string' != typeof secret) throw new TypeError('secret required'); 
           ^
TypeError: secret required 

我試圖找到express.cookieParser API文檔(我甲肝e)和express.session(我沒有),並查看有問題的源代碼。我想像我設置項目的方式有些事情,因爲connect似乎有一個cookieParser以及express,或者express是使用來自connect的cookieParser。

我的package.json看起來像

{ 
    "name": "mplayer", 
    "version": "0.0.1", 
    "private": true, 
    "scripts": { 
    "start": "node app.js" 
    }, 
"dependencies": { 
    "socket.io":"0.9.16", 
    "express": "3.4.0", 
    "jade": "*", 
    "stylus": "*", 
    "cookie": "*" 
    } 
} 

可有人請闡明爲什麼我收到此錯誤的光,其次可以他人分享如何使用Node.js的驗證用戶的最有效的方式,插座.io和express(我知道那裏有各種各樣的文章,但事情似乎已經開始了,很難跟蹤當前的情況)。

回答

1

您需要傳遞解析簽名cookie的祕密。這個功能:

connect.utils.parseSignedCookie(); 

接受兩個參數,第一個是req.cookies,第二個是祕密。這就是你需要使用的功能:

var signedCookies = connect.utils.parseSignedCookie(handshake.headers.cookie, 'secret'); 
// signedCookies['express.sid'] 

你得到錯誤的原因是,你是不是傳遞一個字符串作爲第二個參數,這是失敗的typeof 'string'檢查。

至於認證Socket.IO用戶與Express一起使用時最有效的方法,它已經是你已經使用它的方式。

+0

更新的答案,它實際上是一個不同的原因。 – hexacyanide

+0

我應該閱讀API文檔...謝謝! – avrono

+0

如果沒有發送cookie,客戶端應該設置cookie並重試? – avrono

0
var cookieParser = require('cookie-parser'); 
var cookie = require('cookie'); 
var secret = config.get('session:secret'); 

io.set('authorization', function(handshake, callback){   
     async.waterfall([ 
      function(callback) { 
       handshake.cookies = cookie.parse(handshake.headers.cookie || ''); 
       var sidCookie = handshake.cookies[config.get('session:key')];     
       var sid = cookieParser.signedCookie(sidCookie, secret);    
      } 
     }); 

https://www.npmjs.com/package/cookie-parser#cookieparser-signedcookie-str-secret-