2015-05-07 5 views
6

Ich habe eine AngularJS-App implementiert, die über Websockets mit dem Backend von Sails kommuniziert und dabei sails.io.js verwendet.SailsJS - Verwendung von sails.io.js mit JWT

Da das Backend im Grunde eine reine API ist und mit anderen Apps verbunden wird, versuche ich Sessions komplett zu deaktivieren und benutze JWT.

Ich habe Express-JWT eingerichtet und kann normale HTTP-Anfragen recht gut verwenden, aber wenn ich eine Anfrage über sails.io.js sende, passiert überhaupt nichts - websocket Anfrage bleibt auf dem Client ausstehend, und nichts passiert auf dem Server (mit "albernen" Loglevel).

Ich habe versucht, sails.io.js Patchen die query parameter zu unterstützen und bei der Verbindung, ich das Token von Angular senden, aber im besten Fall, erhalte ich eine Antwort mit Fehlermeldung von Express-jwt kommenden Anmeldeinformationen zu sagen fehlen ...

Ich habe auch einige Hinweise gesehen, dass socket.js in Segeln muss mit beforeConnect geändert werden, ich habe socketio-jwt gesehen, aber habe keine Ahnung, wo und wie man das in, in Sails.

Hat jemand das implementiert und verwendet JWT mit Sails und Sockets? Ich würde schätzen jede Art von Hinweis in welche Richtung zu gehen :)

Antwort

7

Ich erkannte, dass die Politik, die ich an Ort und Stelle und das war Express-JWT zu weit weg von mir abstrahiert, so dass ich nicht herausgefunden habe was genau passierte. Nachdem ich mir andere Beispiele angeschaut habe, habe ich herausgefunden, dass ich nur prüfen muss, was anders ist als Websuchungsanforderungen, und ich habe schnell einen Weg gefunden, das Problem zu umgehen.

So:

  1. Token Unterschrift und Versand bei der Anmeldung
  2. Angular nimmt das Token und speichert in dem lokalen Speicher
  3. einen Abfangjäger erstellen für HTTP-Anforderungen einrichten, um Autorisierungsheader und Token hinzufügen
  4. Korrigieren Sie sails.io.js, um Abfrageparameter weiterzuleiten, die über Optionen bereitgestellt werden (wie in der Frage erwähnt)
  5. Wenn Sie eine Verbindung mit sails.io.js herstellen, senden Sie Token als Abfrageparameter, dh URL + '? token =‘+ Token
  6. In Segel Politik, überprüfen Sie alle Kombinationen für Token, einschließlich req.socket.handshake.query, wie unten:

    module.exports = function (req, res, next) { 
    
    var token; 
    
    if (req.headers && req.headers.authorization) { 
    
        var parts = req.headers.authorization.split(' '); 
    
        if (parts.length == 2) { 
    
         var scheme = parts[0], 
         credentials = parts[1]; 
    
         if (/^Bearer$/i.test(scheme)) { 
          token = credentials; 
         } 
    
        } else { 
         return res.json(401, {err: 'Format is Authorization: Bearer [token]'}); 
        } 
    
    } else if (req.param('token')) { 
    
        token = req.param('token'); 
        // We delete the token from param to not mess with blueprints 
        delete req.query.token; 
    
    } 
    
    // If connection from socket 
    else if (req.socket && req.socket.handshake && req.socket.handshake.query && req.socket.handshake.query.token) { 
    
        token = req.socket.handshake.query.token; 
    
    } else { 
        sails.log(req.socket.handshake); 
        return res.json(401, {err: 'No Authorization header was found'}); 
    } 
    
    JWTService.verifyToken(token, function (err, token) { 
    
        if (err) { 
         return res.json(401, {err: 'The token is not valid'}); 
        } 
    
        sails.log('Token valid'); 
    
        req.token = token; 
    
        return next(); 
    
    }); 
    
    }; 
    

Es funktioniert gut! :)