首页 > 解决方案 > 如何在通过 socket.io 的通信中使用 jwtToken?

问题描述


我想通过 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()
           }

    });

这是一个好方法吗?

标签: angularsocket.iojwt

解决方案


你可以把你的 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();
    }

  }

并在套接字服务器上“使用”此功能,例如

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

Socke.io namespace.use(fn) API


推荐阅读