javascript / socket.io – 与twitter问题的Socket.IO授权

所以我写了一个带有“授权”逻辑的Socket.IO应用程序,以确保用户在允许用户连接到websocket服务器之前login到Twitter。 但我遇到的问题是client.js尝试做一个io.connect之前用户点击TWITTERlogin(即io授权检查),由于它尚未validation失败。 当用户最终点击Twitterlogin并通过OAuth进程时,套接字不会连接,因为套接字authentication逻辑已经从初始连接失败。

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> 

所以问题是,服务器端的“连接”和客户端的“连接”function都没有运行,因为用户从来没有login过twitter。 当用户最终login时,套接字授权function已经失败。

如何才能让客户端在用户实际login之前不尝试连接? 我是否将其保存在不同的文件中并稍后导入? 我在授权function中写一些服务器callback? 我的JavaScript是弱的,因为我正在与socket.io一起学习JavaScript。 请指教,非常感谢。

如果你使用ejs来渲染,代码将如下所示:

server.js

  app.get("/authed", function (req, res) { res.render("authed", {}); }); 

layout.ejs

  <body> <div> <%- body %> </div> </body> 

index.ejs

  <a href="www.example.com/twitter/auth">twitter login!</a> 

authed.ejs

  <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io.connect(); socket.on('connect', function() { alert('client connected!'); socket.emit('hooray'); }); </script> ... ... render whatever else 

希望这可以帮助。