2015-05-07 19 views
6

Ho implementato un'app AngularJS, comunicando con il backend di Sails tramite websockets, utilizzando sails.io.js.SailsJS - utilizzo di sails.io.js con JWT

Poiché il backend è fondamentalmente un'API pura e verrà connesso anche da altre app, sto tentando di disabilitare completamente le sessioni e utilizzare JWT.

Ho impostato express-jwt e posso utilizzare le richieste HTTP regolari abbastanza bene, ma quando invio una richiesta tramite sails.io.js, non succede nulla - la richiesta websocket rimane in sospeso sul client e non succede nulla sul server (con livello di registro "sciocco").

Ho provato a correggere sails.io.js per supportare lo query parameter e, durante la connessione, invio il token da Angular, ma nel migliore dei casi, ottengo una risposta con un messaggio di errore proveniente da express-jwt che dice le credenziali Mancano ...

Ho anche visto alcuni suggerimenti che socket.js in vele deve essere modificato con beforeConnect, ho visto socketio-jwt, ma non ho idea di dove e come collegarlo, in Sails.

Qualcuno ha implementato questo e sta usando JWT con vele e prese? Apprezzerei qualsiasi suggerimento in quale direzione andare :)

risposta

7

Mi sono reso conto che la politica che ho messo in atto e che usava express-jwt si è allontanata troppo da me, quindi non ho capito cosa stava succedendo esattamente. Dopo aver esaminato altri esempi, ho capito che avevo solo bisogno di controllare le richieste di websocket rispetto a quelle normali, e ho trovato rapidamente un modo per aggirare il problema.

Quindi:

  1. impostare la firma di token e l'invio su login
  2. angolare prende il token e salva in memoria locale
  3. Crea un intercettore per le richieste HTTP per aggiungere un'intestazione di autorizzazione e token di
  4. Correggere sails.io.js per inoltrare i parametri di ricerca forniti tramite opzioni (come menzionato nella domanda)
  5. Quando ci si connette usando sails.io.js, invia token come parametro di query, cioè url + '? Token =' + gettone
  6. In politica vele, controllare tutte le combinazioni per Token, tra cui req.socket.handshake.query, come di seguito:

    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(); 
    
    }); 
    
    }; 
    

funziona bene! :)