2013-10-01 23 views
26

Socket.IO'daki yetkilendirme ve el sıkışma işlevinin ne olduğunu merak ediyorum. Zaten GitHub'dan kendi wiki ve authorizing guide okudum ama yine de aşağıdaki anlamıyorum:Socket.IO ile yetkilendirme ve el sıkışma

  1. nasıl Socket.io yetkilendirme çalışır?
  2. Socket.IO'daki el sıkışma nedir?
  3. handshakeData nesnesine herhangi bir şey ekleyebilir miyim?

Umarım soruma cevap verebilirsiniz. Teşekkürler.

cevap

51

Düzenleme: Socket.IO 1.0'da, ara katman yazılımı artık kullanıldı. Yetkilendirme şöyle yapılabilir:

io.use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

sadece next() geri aramayı bir hata nesnesi geçmesi, soket reddetmek gerekir olsaydı. Aynı şey ad ile yapılabilir: Socket.IO içinde

io.of('/namespace').use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

Yetkilendirme bir geri geçtiği bir boolean karar verilir bir fonksiyonu gözden geçirmek. Bu fonksiyon, bir bağlantı, bir el sıkışma çalıştığı her seferde çalıştırır ve bu gibi görünüyor budur:

io.set('authorization', function (handshake, callback) { 
    callback(null, true); 
}); 

fonksiyon callback() iki parametre kabul eder. Birincisi, varsa, hata nedenidir ve ikinci parametre, bir istemcinin bağlanıp bağlanamayacağını belirleyen booledir. Varsayılan olarak, yetkilendirme yoktur, bu nedenle yukarıdaki kod örneğinde, bağlanan soketin true ile geçişe izin verildiği senaryo gösterilir.

Socket.IO'daki el sıkışma, diğer tüm bilgi teknolojisi ile ilgili el sıkışmalarına benzer. Socket.IO'nun durumunda, bir müşterinin bağlanıp bağlanamayacağına karar verir ve bağlantıyı reddeder. El sıkışma bir XHR veya JSONP isteği ile başlatılır ve hiçbir yetkilendirme belirtilmemişse çok fazla işlem yapmaz, ancak handshake veri nesnesinde geçirilen verilerde yardımcı olabilir.

Son sorunuzu yanıtlamak için, evet, handshake nesnesine herhangi bir şey ekleyebilirsiniz. Eğer soket tabanlı özelliklerini saklayabilir çünkü

io.set('authorization', function (handshake, callback) { 
    handshake.foo = 'bar'; 
    callback(null, true); 
}); 

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.foo); // bar 
}); 

Bu, çok kullanışlıdır: Nesne böyle şeyler yapmanızı sağlar socket.handshake nesneye, aynı değişken referanstır. Bunun yaygın kullanımı, Socket.IO tarafından iletilen çerezlere dayanarak oturum kimliğini tanımlayabildiğimiz Express çerçevesi ile eşleşen bir oturum tanımlanabilir.

+0

teşekkürler kardeşim. Bu aradığım cevap bu. :) –

+4

Bu daha fazla beğeni hak ediyor. El sıkışma soket olayları içinde socket.handshake üzerinden ulaşılabilir olması gerçeği çok yararlı lanetlenmiştir. – Deminetix

+3

Eğer 'next (new Error (' Forbidden '))' i çağırırsam; '- bağlantım hakkında nasıl bilgi alabilirim? Ben orta yazılımdan .emit() yapamıyorum çünkü sonraki (yeni Hata ('')) daha fazla iletişimi reddediyor. – cadavre

2

Şimdi ben bu basit yöntemi kullanıyorum:

io.set('authorization', function (handshakeData, accept) { 
    var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0]; 
    if('myDomain.com'==domain) 
    accept(null, true); 
    else 
    return accept('Deny', false); 
}); 
9

Socket.io 1.0 beri geriye olmamasına rağmen o "io kullanılması önerilir uyumluluğu.Düğüm Sunucu tarafında, böylece ad-hoc ortakatmanını eklemek için ") (kullanın:

io.use(function(socket, next){ 
    var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters); 
    if (joinServerParameters.token == "xxx"){ 
    next();   
    } else { 
    //next(new Error('Authentication error'));     
    } 
    return;  
}); 

Ve istemci tarafında

, el sıkışma için kendi özelliğini eklemek için, bu şekilde görünecektir:

var joinServerParameters = { token: "xxx" };  
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) }); 
0

i çok geç ama ben socket.io kullanarak el sıkışma yetkilendirme hakkında çok iyi makale buldum bilgiyi eklemek istiyorum biliyoruz.

socket.io authorization

İlgili konular