JWTを使用したソケットio接続の認証


106

socket.io接続を認証するにはどうすればよいですか?私のアプリケーションは別のサーバー(Python)からのログインエンドポイントを使用してトークンを取得しますが、ユーザーがノード側でソケット接続を開くたびにそのトークンを使用するにはどうすればよいですか?

io.on('connection', function(socket) {
    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

そしてクライアント側:

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
    query: 'token=' + token
});

トークンがPythonで作成されている場合:

token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

このトークンを使用してノードのソケット接続を認証するにはどうすればよいですか?

回答:


226

トークンが別のサーバーで作成されたかどうかは関係ありません。適切な秘密鍵とアルゴリズムがあれば、それを確認できます。

jsonwebtokenモジュールによる実装

クライアント

const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000', {
  query: {token}
});

サーバ

const io = require('socket.io')();
const jwt = require('jsonwebtoken');

io.use(function(socket, next){
  if (socket.handshake.query && socket.handshake.query.token){
    jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
      if (err) return next(new Error('Authentication error'));
      socket.decoded = decoded;
      next();
    });
  }
  else {
    next(new Error('Authentication error'));
  }    
})
.on('connection', function(socket) {
    // Connection now authenticated to receive further events

    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

socketio-jwtモジュールによる実装

このモジュールにより、クライアント側とサーバー側の両方で認証がはるかに簡単になります。彼らの例をチェックしてください。

クライアント

const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
  socket
    .on('authenticated', function () {
      //do other things
    })
    .emit('authenticate', {token}); //send the jwt
});

サーバ

const io = require('socket.io')();
const socketioJwt = require('socketio-jwt');

io.sockets
  .on('connection', socketioJwt.authorize({
    secret: 'SECRET_KEY',
    timeout: 15000 // 15 seconds to send the authentication message
  })).on('authenticated', function(socket) {
    //this socket is authenticated, we are good to handle more events from it.
    console.log(`Hello! ${socket.decoded_token.name}`);
  });

ソケットへの着信接続がないのに問題が発生しています。ソケットサーバーを起動すると、まだ古いトークンが残っています。それは変ですか?
Lamour 2016年

クライアントAPIのio.connectで利用可能なオプションは何ですか
rocketspacer 2017

2
ユーザーが最初に許可されておらず、最初の試行で秘密がなかった場合、どのようにサーバーに再接続しますか?
sznrbrt 2017年

9
こんにちは、私は尋ねる必要があります、トークンは接続時またはすべての放出イベントで一度だけ必要ですか?
Krunal Limbad 2018

2
取得する人のためにCannot read property 'on' of undefined; ただ削除socketからfunction(socket)
ThomasOrlita19年

-28

このURLを使用できます。

var socket = SocketIOClient(socketURL: URL(string: "http://00.00.00.00:port")!, config: SocketIOClientConfiguration(arrayLiteral: SocketIOClientOption.connectParams(["token": "your secret key"])))

9
あなたはあなたが迅速な言語を書いていることを述べる必要があります。他の人はそれを知らないだけです。
ソードジェイソン

6
あなたはこの答えを説明する必要があります、さもなければこれは誰にとっても役に立ちません。また、それが迅速な言語で書かれている場合は、あなたの答えの中でそれを述べてください
フレディダニエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.