2012-07-10 3 views
1

J'ai donc écrit une application Socket.IO avec la logique 'autorisation' pour m'assurer que l'utilisateur est connecté à Twitter avant de pouvoir se connecter au serveur websocket . Mais le problème que j'ai est que le client.js essaie de faire un io.connect AVANT que l'utilisateur clique sur TWITTER LOGIN (que io contrôle d'autorisation), qui échoue parce qu'il n'est pas encore authentifié. Lorsque l'utilisateur clique finalement sur Twitter Login et passe par le processus OAuth, le socket ne se connecte pas car la logique d'authentification du socket a déjà échoué à partir de la connexion initiale.javascript/socket.io - Autorisation Socket.IO avec le numéro de twitter

server.js

// routes 
app.get('/auth/twitter', passport.authenticate('twitter'), function(req, res){}); 
app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), function(req, res){ 
    res.redirect('/authed'); 
}); 

// socket auth 
parseCookie = require('connect').utils.parseCookie; 
io.configure(function() { 
io.set('authorization', function (data, accept) { 
    if (data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['session.sid']; 
     sessionStore.get(data.sessionID, function (err, session) { 
      if (err || !session || (typeof session.twitter.user == 'undefined')) { 
       accept(null, false); 
      } 
      else { 
       data.session = session; 
       accept(null, true); 
      } 
     }); 
    } 
    else { 
     return accept(null, false); 
    } 
}); 

io.sockets.on('connection', function (socket) { 
    console.log('authenticated!'); 
    socket.on('hooray', function(){ 
     console.log('client message received'); 
    }); 
}); 

Client.js

var socket = io.connect(http://example.com); // connect to server.js code 
socket.on('connect', function() { 
    alert('client connected!'); 
    socket.emit('hooray'); 
}); 

// code for twitter link url for user to authenticate 
<a href="www.example.com/twitter/auth">twitter login!</a> 

La question est donc .. ni la 'connexion' du côté du serveur, ni la fonction 'connecter' côté client fonctionne parce que la L'utilisateur ne s'est jamais connecté à Twitter pour le moment. Lorsque l'utilisateur se connecte enfin, la fonction d'autorisation de socket a déjà échoué.

Comment puis-je faire en sorte que le client n'essaie pas de se connecter avant que l'utilisateur ne se connecte? Est-ce que je l'enregistre dans un fichier différent et l'importe plus tard? Est-ce que j'écris un rappel de serveur dans la fonction d'autorisation? Mon javascript est faible car j'apprends javascript avec socket.io. S'il vous plaît aviser, merci beaucoup.

+1

La socket ne doit pas être créée dans le rappel de la fonction utilisée pour l'authentification de Twitter, côté client. – almypal

+0

Je ne sais pas à quoi cela ressemblerait du côté client. Le seul morceau de code que j'ai sur le côté client est littéralement le dans le code client.js. Devrais-je gérer cela différemment? –

Répondre