【问题标题】:javascript/socket.io -- Socket.IO authorization with twitter issuejavascript/socket.io -- 带有 twitter 问题的 Socket.IO 授权
【发布时间】:2012-07-09 12:16:36
【问题描述】:

所以我编写了一个带有“授权”逻辑的 Socket.IO 应用程序,以确保用户在允许用户连接到 websocket 服务器之前登录到 Twitter。但我遇到的问题是,client.js 在用户点击 TWITTER LOGIN(即 io 授权检查)之前尝试执行 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授权功能已经失效了。

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

【问题讨论】:

  • 不应该在客户端用于推特认证的函数回调中创建套接字。
  • 我不确定这在客户端会是什么样子。我在客户端拥有的唯一一段代码实际上是 client.js 代码中的 。我应该以不同的方式处理吗?

标签: node.js socket.io


【解决方案1】:

如果您使用 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-08-24
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多