したがって、ソケットj。をバックエンドとして、通常のjavascriptをフロントエンドとしてノードjsを実行するアプリケーションがあります。私のアプリケーションには現在、ログインシステムがあり、現在、クライアントは接続されるとすぐにログインデータを送信するだけです。
ここで、ログインデータがhandshakeDataと共に送信される方がはるかに良いと考えたため、(接続を確立した後ではなく)接続中にユーザーに直接ログインさせることができ、ログインデータが無効な場合は承認をそれぞれ拒否します。
追加データをhandshakeDataのヘッダー部分に入れるのが最善だと考えています。 (可能であれば、socket.ioを変更する必要はありませんが、それが唯一の方法である場合は、それと一緒に生活できます)
Socket.IO APIの下で多くのコメントが指摘されているように、1.0
リリース。これで、認証はミドルウェア関数を介して実行されるはずです。「認証の違い」@ http://socket.io/docs/migrating-from-0-9/#authentication-differences を参照してください。古いドキュメントがなくなっているように思われるため、<1.0に固執している人のためのオリジナルの回答を含めます。
クライアント側:
//The query member of the options object is passed to the server on connection and parsed as a CGI style Querystring.
var socket = io("http://127.0.0.1:3000/", { query: "foo=bar" });
サーバ側:
io.use(function(socket, next){
console.log("Query: ", socket.handshake.query);
// return the result of next() to accept the connection.
if (socket.handshake.query.foo == "bar") {
return next();
}
// call next() with an Error if you need to reject the connection.
next(new Error('Authentication error'));
});
クエリを渡すことができます:承認メソッドでサーバー上で利用できるクライアント側のconnect()への2番目の引数のparam。
私はちょうどそれをテストしています。クライアントには次のものがあります。
var c = io.connect('http://127.0.0.1:3000/', { query: "foo=bar" });
サーバー上:
io.set('authorization', function (handshakeData, cb) {
console.log('Auth: ', handshakeData.query);
cb(null, true);
});
サーバー上の出力は次のようになりました。
:!node node_app/main.js
info - socket.io started
Auth: { foo: 'bar', t: '1355859917678' }
これはv1.0.0で変更されました。 移行ドキュメント を参照してください
基本的に、
io.set('authorization', function (handshakeData, callback) {
// make sure the handshake data looks good
callback(null, true); // error first, 'authorized' boolean second
});
になります:
io.use(function(socket, next) {
var handshakeData = socket.request;
// make sure the handshake data looks good as before
// if error do this:
// next(new Error('not authorized');
// else just call next
next();
});
Socket.io v1.2.1の場合、これを使用します。
io.use(function (socket, next) {
var handshake = socket.handshake;
console.log(handshake.query);
next();
});
これは、クエリデータをnodejsおよびserver.ioサーバークライアントに送信するためのコードです。
var socket = io.connect(window.location.Origin, { query: 'loggeduser=user1' });
io.sockets.on('connection', function (socket) {
var endp = socket.manager.handshaken[socket.id].address;
console.log("query... " + socket.manager.handshaken[socket.id].query.user);
}
おそらくAPIは変更されましたが、サーバーに追加情報を取得するために次のことを行いました。
// client
io.connect('localhost:8080', { query: 'foo=bar', extra: 'extra'});
// server
io.use(function(sock, next) {
var handshakeData = sock.request;
console.log('_query:', handshakeData._query);
console.log('extra:', handshakeData.extra);
next();
});
プリント
_query: { foo: 'bar',
EIO: '3',
transport: 'polling',
t: '1424932455409-0' }
extra: undefined
誰かがハンドシェイクを介してクライアントからサーバーにデータを取得する方法を知っている場合クエリparamsにありません教えてください。
更新この構文で後で問題に遭遇しました
io.connect('localhost:8080?foo=bar');
私が現在使用しているものです。
。loggeduserを見るために少し問題を見つけました
io.sockets.on('connection', function (socket) {
var endp = socket.manager.handshaken[socket.id].address;
console.log("query... " + socket.manager.handshaken[socket.id].query.loggeduser);
// ↑ here
}
古いスレッドですが、jwtトークン/セッションIDをセッションCookie(標準のもの)に保存すると仮定すると、これはハンドシェイク(socket.io-client)を行うときにデフォルトでサーバーに渡されます。 Cookieを介して(ミドルウェアまたはon.connectionを介して)ハンドシェイクの認証情報を取得するだけで問題はありますか?例えば。
io.on('connection', function(socket) {
// assuming base64url token
const cookieStr = socket.handshake.headers.cookie
const matchRes =
cookieStr == null
? false
: cookieStr.match(/my-auth-token=([a-zA-Z0-9_.-]+)/)
if (matchRes) {
// verify your jwt...
if ( tokenIsGood(matchRes[1]) {
// handle authenticated new socket
} else {
socket.emit('AUTH_ERR_LOGOUT')
socket.disconnect()
}
} else {
socket.emit('AUTH_ERR_LOGOUT')
socket.disconnect()
}
}
私は現在これをプロジェクトに使用していますが、うまく機能しています。