2014-09-11 9 views
5

Sto lavorando con loopback 2.0 e socket.io 1.0.6.Utilizzare il token di loopback per l'autenticazione di socket.io

Mi piacerebbe utilizzare il metodo di autenticazione loopback per l'autenticazione di socket.io.

Ho trovato il metodo per autenticare gli utenti in loopback/lib/middleware/token.js. https://github.com/strongloop/loopback/blob/master/lib/middleware/token.js

poi scrivo come di seguito:

var loopback = require('loopback'); 
var ioapp = module.exports = socketio; 

function socketio(server) { 
    var io = require('socket.io')(server); 

    // auth 
    io.use(function(socket, next) { 
    loopback.token()(socket.request, null, next); 
    }); 

    // listeners 
    ... 

    return io; 
}; 

Ma in realtà non funziona e causa errore come questo.

/Users/.../project_root/node_modules/loopback/lib/models/access-token.js:201 
    id = req.param(params[i]); 
      ^
TypeError: Object #<IncomingMessage> has no method 'param' 
    at tokenIdForRequest (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/loopback/lib/models/access-token.js:201:14) 
    at Function.AccessToken.findForRequest (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/loopback/lib/models/access-token.js:123:12) 
    at /Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/loopback/lib/middleware/token.js:53:16 
    at Array.0 (/Users/ksuzuki/Projects/appsocially/repo/chat-center/server/socket.js:15:28) 
    at run (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/socket.io/lib/namespace.js:114:11) 
    at Namespace.run (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/socket.io/lib/namespace.js:126:3) 
    at Namespace.add (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/socket.io/lib/namespace.js:155:8) 
    at Client.connect (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/socket.io/lib/client.js:67:20) 
    at Server.onconnection (/Users/ksuzuki/Projects/appsocially/repo/chat-center/node_modules/socket.io/lib/index.js:309:10) 
    at Server.EventEmitter.emit (events.js:95:17) 

Immagino che questo sia perché ho passato il tipo di oggetto sbagliato al metodo loopback.token().

+0

Quell'oggetto richiesta dovrebbe essere l'espresso richiesta oggetto. L'ID del token di accesso viene estratto da 'req.params' per verificare se si tratta di un token valido. – richardpringle

risposta

1

Beh, credo che il token di loopback sia stato creato per essere utilizzato con l'oggetto di richiesta espresso. Nell'ultima versione (2.x) è possibile utilizzarlo se si esegue l'override di AccessToken.findForRequest e implementarlo personalmente.

Ma c'è un altro approccio a questo che è coperto in the official documentation:

Fondamentalmente si suggeriscono usando socketio-auth (che "fornisce ganci per implementare l'autenticazione in socket.io senza utilizzare querystrings per inviare le credenziali, che non è una buona sicurezza pratica ") e utilizzando direttamente il modello AccessToken.

ho messo il codice qui con un po 'di semplificazione:

Sul lato server:

app.io = require('socket.io')(app.start()); 
require('socketio-auth')(app.io, { 
    authenticate: function (socket, value, callback) { 

     var AccessToken = app.models.AccessToken; 
     //get credentials sent by the client 
     var token = AccessToken.count({ 
     userId: value.userId, 
     id: value.id, 
     }, callback); 
    } 
}); 

Sul lato client:

socket.on('connect', function() { 
    // You should have retrieved tokenId/userId by calling user.login and 
    // saving it in cookies or localStorage. 
    socket.emit('authentication', {id: tokenId, userId: userId }); 
}); 
Problemi correlati