如何通过socket.io在通信中使用jwtToken?

时间:2018-05-10 11:24:17

标签: angular socket.io jwt


我想通过socket.io与angular和nodejs-express进行通信 验证用户身份验证的最佳方法是什么?

io.on('connection', function (socket) {
        let jwt = socket.token;
        //to Implement
        let isAuth = authService.verifyToken(jwt);
         if (!isAuth) {
           socket.disconnect()
           }

    });

这是一个好方法吗?

2 个答案:

答案 0 :(得分:0)

你可以将你的JWT放在一个HttpOnly Cookie中(它是raccomanded),

此cookie将由浏览器在第一个http / s连接中自动发送,

然后在服务器端你可以做:

这是设置cookie

_res.cookie('JWT', jwtBearerToken, { maxAge: expireMilliseconds, httpOnly: true})

然后

function async verifyToken(_socket: Socket, _next: NextFunction) {

    let xsrfToken = _socket.handshake.headers['x-xsrf-token'];
    var cookie = _socket.request.headers.cookie
    if (_socket.request.headers.cookie && xsrfToken) {

      let token = parseCookie(cookie);
      let decodedJWT: any;

      try {
      //using jsonwebtoken library
        decodedJWT = await 
   jwt.verify(token.JWT, this.RSA_PUBLIC_KEY, { algorithms: ['RS256'], });


      } catch (err) {
        //do something

        return;
      }
      _next();
    }

  }

并在socket-server上“使用”此函数,如

io.use((socket, next) => this.verifyToken(socket,next));

Socke.io namespace.use(fn) API

答案 1 :(得分:0)

我找到了一种有用的方法,可以使用 socketio-jwt

var socketioJwt = require('socketio-jwt');

var io = socketIo.listen(server);

io.set('authorization', socketioJwt.authorize({
  secret: 'YOUR-SECRET',
  handshake: true
}));

并在正面:this.socket = io(URLS.BASE_URL,{ query: 'token=' + localStorage.getItem('my-token') });

我们假设jwt令牌存储在本地存储中。