2013-10-02 2 views
0

Je suis « jouer » avec l'authentification en utilisant Node.js, exprimer et Socket.IOQuelle est la meilleure approche pour l'autorisation avec Node.js et Socket.io

J'ai essayé l'exemple ici 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); 
}); 

Je continue à obtenir une erreur générée par connexion, plus précisément cette ligne d'appel

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 

J'ai essayé de trouver la documentation api pour express.cookieParser (que je VHA e) et express.session (que je n'ai pas) et regardé le code source incriminé. J'imagine qu'il y a quelque chose qui se passe dans la façon dont j'ai configuré le projet car connect semble avoir un cookieParser aussi bien qu'express, ou exprès utilise le cookieParser de connect.

Mon package.json ressemble

{ 
    "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": "*" 
    } 
} 

Quelqu'un peut-il s'il vous plaît faire la lumière sur la raison pour laquelle je reçois cette erreur et d'autre part peut quelqu'un partager la façon la plus efficace d'authentification d'un utilisateur à l'aide Node.js, prise .io et express (Je sais qu'il existe plusieurs articles, mais les choses semblent s'être déplacées, il est difficile de savoir ce qui est courant).

Répondre

1

Vous devez transmettre un secret pour l'analyse des cookies signés. Cette fonction:

connect.utils.parseSignedCookie(); 

accepte deux arguments, le premier étant req.cookies, le second étant le secret. Voici comment vous devez utiliser la fonction:

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

La raison pour laquelle vous obtenez l'erreur, est que vous n'êtes pas le passage d'une chaîne comme le second argument, qui est ce qui échoue le contrôle typeof 'string'.

En ce qui concerne la manière la plus efficace d'authentifier les utilisateurs Socket.IO lorsqu'ils sont utilisés conjointement avec Express, c'est déjà la manière dont vous l'utilisez déjà.

+0

Mise à jour de réponse, il est en fait une autre raison. – hexacyanide

+0

J'aurais dû lire les documents API pour ça ... merci! – avrono

+0

Si aucun cookie n'a été transmis, le client doit-il définir un cookie et réessayer? – 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-

Questions connexes