Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 服务/停止服务插座.IO_Node.js_Websocket_Socket.io_Passport.js_Passport Local - Fatal编程技术网

Node.js 服务/停止服务插座.IO

Node.js 服务/停止服务插座.IO,node.js,websocket,socket.io,passport.js,passport-local,Node.js,Websocket,Socket.io,Passport.js,Passport Local,我想知道如何才能只为登录用户提供socket.io 现在我只是添加/删除 <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); </script> var socket=io(); 但当我在成功会话后删除它时,页面并没有加载。是否只为具有passport会话身份验证的用户使用/服务socket.io?将参数传递给视图引擎 例如,我在这里使

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

现在我只是添加/删除

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

var socket=io();

但当我在成功会话后删除它时,页面并没有加载。是否只为具有passport会话身份验证的用户使用/服务socket.io?

将参数传递给视图引擎

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

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}}
{{#如果经过身份验证}
var socket=io();
{{/if}
这不会以任何方式保护您的服务器

你也可以这样做-

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

</script>

var connect={{authenticated}};
如果(连接){
var socket=io();
}

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

看看这个:

在每次连接尝试时,您都可以运行一个特定的函数来查看是否正常。然后,您可以拒绝连接(使用参数调用
next
),或接受连接-只需调用
next

就这样:)

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

如果您使用的是某种数据库或会话,那么可以使用许多模块中的一个。我一直在使用passport,所以一切都会自动发生。以下是有关如何操作的更多信息:


你看过吗?你为什么想做那样的事?这是一个开源库,任何人都可以从任何地方获得。如果您询问如何只允许注册用户连接到套接字服务器-这是完全不同的。@mef它在某种程度上符合我的需要,但我确信有可能为用户简单地打开/关闭套接字。目前我注意到,如果我将/socket.io/socket.io.js添加到每个站点,并且var socket=io();将被打开/关闭,一切正常,服务器不使用套接字单元。我打开它。@AndreyPopov-这就是重点。我只想在用户为了服务器资源而登录时打开套接字。我不想/不需要为每个匿名者打开我的网站。你知道吗?服务器返回的http状态码是什么,页面的html是呈现的而不是显示的,还是整个
都是空的?这就是我现在正在做的。但如何保护服务器呢?另外:假设我想让人们在我的聊天记录上写东西。现在,我如何确保服务器上的某些用户不更改其id(如果我不显示它,如何从js获取它?)并更改其消息下显示的登录名?在数据中传递一些令牌。验证令牌是否与存储在服务器中的令牌与用户会话相匹配。不幸的是,这不会阻止任何人在控制台
io()
中写入,所有内容都会触发:)passport.socketio-完全赢!!!谢谢你,伙计!我目前正在postgres中使用passport本地策略来维护auth。使用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
}