1

そこで、ユーザーがWebSocketサーバーに接続できるようにする前に、ユーザーがTwitterにログインしていることを確認するために、「承認」ロジックを使用してSocket.IOアプリを作成しました。しかし、私が抱えている問題は、ユーザーがTWITTER LOGIN(io認証がチェックする)をクリックする前にclient.jsがio.connectを実行しようとすることです。これは、まだ認証されていないため失敗します。ユーザーが最終的にTwitterログインをクリックしてOAuthプロセスを実行すると、ソケット認証ロジックが最初の接続からすでに失敗しているため、ソケットは接続されません。

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>

したがって、問題は..ユーザーがまだTwitterにログインしていないため、サーバー側の「接続」もクライアント側の「接続」機能も実行されないことです。ユーザーが最終的にログインしたとき、ソケット認証機能はすでに失敗しています。

ユーザーが実際にログインする前にクライアントが接続を試みないようにするにはどうすればよいですか?別のファイルに保存して後でインポートしますか?承認関数でサーバーコールバックを記述しますか?私はsocket.ioと一緒にjavascriptを学んでいるので、私のjavascriptは弱いです。アドバイスしてください、どうもありがとう。

4

1 に答える 1

2

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

お役に立てれば。

于 2012-07-10T12:53:03.217 に答える