2013-10-23 42 views
7

私はこのチュートリアル:http://howtonode.org/socket-io-authを赤色にしました。 expressとsocket.ioを使用してユーザーを認証する方法を示します。 しかし、expressを必要とせずにsocket.ioだけを使用してユーザーを認証する方法はありますか?socket.ioを使用したユーザー認証

編集:セッション処理のために

私はRedisStore(https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO)を使用します。 左は認証Cookieを作成するためのモジュールです。 誰かがソケットの処理と同様に認証Cookieを作成するために使用できるsocket.io実装について知っていますか?

+0

Socket.IOをスタンドアロンとして使用していますか?オーセンティケータはクッキーを作成せず、単にSocket.IOに渡します。 – hexacyanide

+0

@hexacyanide私はsocket.ioでexpressを使っています。 Expressは認証クッキーを作成するだけです。私はルーティング、ミドルウェア、それを使用しないでください.... expressとsocket.ioの間のセッションは、connect-redisと共有されます。私はそれがクッキーに署名するためにのみ表現を使用するあまりにも大きな依存性の方法だと思う。だから私はエクスプレス(接続)に依存しないソリューションを探しています。私は自分のテストされていない、安全でない認証手続きを実装することができましたが、Golo Rodenのように、それはお勧めできません。 – bekite

+0

つまり、基本HTTPサーバーで実行される実装を希望しますか? HTTPサーバーを完全に使用したくない場合は、Cookieを使用しますか? – hexacyanide

答えて

9

私はこれが少し古いと知っていますが、将来の読者は、クッキーを解析してストレージからセッションを取得するアプローチ(例:passport.socketio)に加えて、トークンベースのアプローチを検討することもできます。

この例では、かなり標準的なJSON Webトークンを使用しています。あなたは、クライアントのページにトークンを与える。この例ではJWTを返す認証エンドポイントを想像する必要があります。

var jwt = require('jsonwebtoken'); 
// other requires 

app.post('/login', function (req, res) { 

    // TODO: validate the actual user user 
    var profile = { 
    first_name: 'John', 
    last_name: 'Doe', 
    email: '[email protected]', 
    id: 123 
    }; 

    // we are sending the profile in the token 
    var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 }); 

    res.json({token: token}); 
}); 

次のように、あなたのsocket.ioサーバを設定することができます。

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

var sio = socketIo.listen(server); 

sio.set('authorization', socketioJwt.authorize({ 
    secret: jwtSecret, 
    handshake: true 
})); 

sio.sockets 
    .on('connection', function (socket) { 
    console.log(socket.handshake.decoded_token.email, 'has joined'); 
    //socket.on('event'); 
    }); 

あなたが唯一の接続時に、それを添付する必要があり、クライアントからのようsocket.io-JWTミドルウェアは、クエリ文字列にトークンを期待:

var socket = io.connect('', { 
    query: 'token=' + token 
}); 

私はこのメタについてのより詳しい説明を書きましたodおよびクッキーhere

+1

このため、トークンはセッションのように使用されませんか?のように、トークンはクライアント以外のどこにも格納されませんか?トークンをセッションストア内のセッションIDとして使用するのと同じ(セキュリティに関して)シークレットを使用してトークンをデコードすることはありますか?私はちょうどこのトークンベースのメソッドのメリットの周りに私の頭をラップしようとしています。 – funseiki

+0

@JoséF. Romaniello私はCookieベースの認証を求めましたが、私はあなたの答えを受け入れます。 2013年には、クッキーは道のりだったと思いました。あなたの記事(auth0の他の記事)を読んだ後、トークンを試してみましょう。 – bekite

3

手動で認証とセッション処理コードを手動で配線する代わりに、session.socket.ioなどの専用モジュールを使用することをおすすめします(ただし、これもExpressが必要なモジュールです)。

何らかの種類のセッション処理が必要なためダウンボートがあると思いますが(おそらくわかりません)、おそらく手動でこれをやりたいとは思わないでしょう。したがって、ここでExpressを守るのは良い考えです。

それでも、Expressなしではどうやってそれを行うのかは私は答えられませんが、興味深い質問です。

+0

私はRedisStoreを使用します。それをhttps://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IOで見つけました。 – bekite

1

私はnode.jsをかなり使い始めました。数日前に開始されました。私は質問への最初の部分に答えることができます。これは、明示的な使用をせずにユーザーの認証です。私はまだセッションスタイルのハンドリングを持っていません。
私がまだこの質問に答えているのは、初心者のためのより簡単な代替ソリューションでノードに慣れていない他の人々を助けることです。

私の学習プロジェクト(socket.ioベースのチャット、他に何がありますか?)で現在使用している解決策は、認証にhttpサーバを使用しています。
httpサーバで有効な認証を取得できない場合は、socket.ioインターフェイスを持つページにアクセスすることはできません。

httpサーバー上のユーザー認証は、いくつかのPOSTデータを読み取ることによって処理されます。 POSTデータが有効なユーザーデータである場合に限り、ユーザーはsocket.ioインターフェイスがあるチャットに移動することができます。

関連する問題