登录后如何连接到套接字 - JWT

Posted

技术标签:

【中文标题】登录后如何连接到套接字 - JWT【英文标题】:How to connect to socket after login - JWT 【发布时间】:2017-01-08 09:48:52 【问题描述】:

我正在使用 socketio-jwt 来验证套接字。

在服务器上:

socketio.use(require('socketio-jwt').authorize(
  secret: config.secrets.session,
  handshake: true
));

在客户端:

var iosocket = io('', 
  query: 'token=' + Auth.getToken(),
  path: '/socket.io-client'
);

我的问题是,如果客户端连接到服务器,则身份验证失败,并且没有建立与套接字的连接。现在如果用户登录系统,与套接字的连接仍然没有建立。

我试图实现的是,如果用户登录系统,连接就会建立。

到目前为止,我唯一的想法是在登录后使用$window.location.href = '/'; 之类的内容重新加载页面。但这似乎不是正确的方法。

另一种选择是让套接字尝试(重新)连接超时。但这是一个糟糕的选择,因为我的应用程序允许用户无需登录。

如何正确触发套接字连接?

【问题讨论】:

用户登录后为什么不触发连接? 【参考方案1】:
var socket = require('socket.io');
var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = socket.listen(server);
io.on('connection', function (client) 
 // here server side code
)
server.listen(5000);

on client side include
node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js
socket = io.connect(site_url + ":5000",         reconnect: !0    );

【讨论】:

使用!0有什么特殊原因吗?为什么不只是1true【参考方案2】:

这里是您问题的解决方案

首先在您的服务器端,您可以实现用户凭据并将其绑定到token,如下所示。

var jwt = require('jsonwebtoken');
app.post('/loginpage',function(req,res)
 //validate the user here

);

//generate the token of the user based upon the credentials

var server = //create the http server here.

socket.io 服务器端,您可以执行以下操作

  //require socket.io
  var xxx = socketIo.listen //to the server
  xxx.set('auth',socketIojwtauthorize(
    secret: config.secrets.session,
    handshake: true
    ));
   xxx.sockets //here connection on or off by setting up promise

   //server listen to localhost and port of your choice

client发送一个有效的jwt时触发连接

简单的客户端文件将包含以下modules

//function connectsocket(token)
      //connect(
      //and query the token );
  
//socket.on('connect',function()
  //generate the success message here
  ).on('disconnect',function() //your choice )
  //rendering the routes with the server side
  $.post('/loginroute',
  //user credentials passes here 
  ).done(function(bind) connect_socket(  bind.token ))

【讨论】:

以上是关于登录后如何连接到套接字 - JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个套接字后端应用程序连接到单个前端

ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法

如何使用 akka 连接到 Unix 套接字?

Javascript 客户端如何连接到 PHP 套接字服务器?

Java如何使服务器允许连接到套接字端口?

Erlang:连接到服务器,并在同一个套接字上接收输入