服务/停止服务Socket.IO

时间:2016-01-28 13:49:18

标签: node.js websocket socket.io passport.js passport-local

我想知道如何只为登录用户提供socket.io?

现在我只是添加/删除

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io();
</script>

但是当我在成功会话后删除它时,页面没有加载。是否只为拥有护照会话认证的用户使用/服务socket.io?

2 个答案:

答案 0 :(得分:2)

这里真正的答案是使用handshake框架的所谓SocketIO。如果您允许用户连接到您的服务器,它允许您进行一些检查并决定。其他答案只是不自动允许用户连接。但是,如果他只打开一个控制台并对你的服务器实例化套接字 - 他就在网上。

检查出来:http://socket.io/docs/server-api/#namespace#use(fn:function):namespace

在每个连接尝试上,您可以运行特定功能以查看是否正常。然后,您可以拒绝连接(使用参数调用next),或接受它 - 只需致电next

就是这样:))

但是这里有一个棘手的部分 - 如何实际验证用户?每个套接字都使用来自客户端的简单HTTP请求进行实例化。它后来升级到套接字连接。

如果您正在使用某种数据库或会话,则可以使用其中一个模块。我一直在使用护照,所以一切都是自动发生的。以下是有关如何操作的详细信息:https://github.com/jfromaniello/passport.socketio

var io           = require("socket.io")(server),
sessionStore     = require('awesomeSessionStore'), // find a working session store (have a look at the readme)
passportSocketIo = require("passport.socketio");

io.use(passportSocketIo.authorize({
    cookieParser: cookieParser,       // the same middleware you registrer in express
    key:          'express.sid',       // the name of the cookie where express/connect stores its session_id
    secret:       'session_secret',    // the session_secret to parse the cookie
    store:        sessionStore,        // we NEED to use a sessionstore. no memorystore please
    success:      onAuthorizeSuccess,  // *optional* callback on success - read more below
    fail:         onAuthorizeFail,     // *optional* callback on fail/error - read more below
}));

function onAuthorizeSuccess(data, accept){
    console.log('successful connection to socket.io');

    // The accept-callback still allows us to decide whether to
    // accept the connection or not.
    accept(null, true);

    // OR

    // If you use socket.io@1.X the callback looks different
    accept();
}

function onAuthorizeFail(data, message, error, accept){
    if(error)
        throw new Error(message);
    console.log('failed connection to socket.io:', message);

    // We use this callback to log all of our failed connections.
    accept(null, false);

    // OR

    // If you use socket.io@1.X the callback looks different
    // If you don't want to accept the connection
    if(error)
        accept(new Error(message));
    // this error will be sent to the user as a special error-package
    // see: http://socket.io/docs/client-api/#socket > error-object
}

答案 1 :(得分:0)

将参数传递给您的视图引擎

例如,我在这里使用把手 -

app.get('/view', ...
    res.render('view.html', { authenticated : true } );

在你看来

{{#if authenticated }}
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io();
</script>
{{/if}}

这无论如何都无法保护您的服务器

你也可以做类似的事情 -

<script src="/socket.io/socket.io.js"></script>
<script>
    var connect = {{authenticated}} ;
    if(connect) {
       var socket = io();
    }

</script>