2014-09-11 8 views
5

प्रमाणीकरण के लिए लूपबैक टोकन का उपयोग करें मैं लूपबैक 2.0 और socket.io 1.0.6 के साथ काम कर रहा हूं।socket.io

मैं socket.io के प्रमाणीकरण के लिए लूपबैक प्रमाणीकरण विधि का उपयोग करना चाहता हूं।

मुझे लूपबैक/lib/middleware/token.js में उपयोगकर्ताओं को प्रमाणीकृत करने की विधि मिली। https://github.com/strongloop/loopback/blob/master/lib/middleware/token.js

तब मैं नीचे की तरह लिखें:

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

लेकिन असल में मैं काम नहीं करेगा और इस तरह त्रुटि होती है।

/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) 

मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं गलत ऑब्जेक्ट प्रकार को loopback.token() विधि में पास करता हूं।

+0

यही अनुरोध वस्तु एक्सप्रेस होना चाहिए अनुरोध वस्तु। यह देखने के लिए कि यह वैध टोकन है या नहीं, यह देखने के लिए टोकन आईडी को 'req.params' से खींचा जा रहा है। – richardpringle

उत्तर

1

अच्छी तरह से मेरा मानना ​​है कि लूपबैक टोकन को एक्सप्रेस अनुरोध ऑब्जेक्ट के साथ उपयोग करने के लिए बनाया गया है। नवीनतम संस्करण (2.x) में आप इसका उपयोग कर सकते हैं यदि आप AccessToken.findForRequest ओवरराइड करते हैं और इसे स्वयं लागू करते हैं।

लेकिन इस के लिए एक और दृष्टिकोण है जो the official documentation में कवर किया जाता है:

मूल रूप से यह querystrings का उपयोग कर क्रेडेंशियल्स भेजने के लिए बिना socketio-auth उपयोग करने का सुझाव (जो "हुक प्रदान करता है socket.io में प्रमाणीकरण लागू करने के लिए है, जो एक अच्छा सुरक्षा नहीं है अभ्यास ") और सीधे AccessToken मॉडल का उपयोग कर।

मैं सरलीकरण का एक छोटा सा के साथ यहाँ कोड डाल:

सर्वर साइड पर:

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

क्लाइंट साइड पर:

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