Node.js 服务/停止服务插座.IO
我想知道如何才能只为登录用户提供socket.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?将参数传递给视图引擎 例如,我在这里使
<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
}