2017-11-06 30 views
0

これはかなり疑問に思えるかもしれませんが、私は最近Node.jsに入って、Laravel Appで発生する認証と同じ種類の認証がNode.jsで行われるようにする必要があります。WebSocket接続の認証

明らかに、APIを使用する必要がありますが、安全な方法で行う方法については混乱しています。私はこの記事に見てきた:

https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

とAPIの構築に彼らのアルゴリズムで見てきました。しかし、私はそれがどのように安全であるか理解していません。

投稿によると、公開鍵と秘密鍵をデータベースに格納します。公開鍵は誰でも見ることができますが、私有鍵はプライベート鍵です。ただし、サーバーに送信するときは、ハッシュされたバージョンをプライベートサーバーの他のデータとともにサーバーに送信します。

これはすべてうまくやっています。しかし、公開鍵とハッシュが公開されているわけではないため、秘密鍵も公開されていますか?例えば

は、私はちょうどそれとは関係のないユーザーのアクセス権を与えるには、このリンクを共有してから別のユーザーを停止して何次の接続

ws://example.com/pull?public=A89-3NJ2-KAN-NKSN1&hash=QmFzZTY0IHRoZSBoZWxsIG91dCBvZiBtZSBiYWJ5Li4uLi4u

を確立しようと言うことができますか?

答えて

0

リンク先の記事では、セッション全体ではなくリクエストを認証する方法について説明しています。つまり、ユーザーは公開のapi_keyと、APIの特定の要求を表すrequestデータ(株式市場APIの場合は{ "action":"latest_price", "symbol":"GOOG"}など)を送信します。

は、 HMAC(secret, api_key+request)を計算する HMACキーなどの共有APIアクセス秘密鍵を使用してユーザーを認証します。 secretがわからない場合は誰もこれを計算できません。ユーザーとサーバーだけが secretを知っている必要があります。これは基本的にAPIを使用するユーザーのパスワードだからです。

WebSocketを使用しているため、対話形式でリクエストを送信すると仮定します。ソケットセッション全体を認証する場合、このアプローチは意味がありません。これは、単一の要求を認証するように設計されているためです。このアプローチを個々のリクエストに適用することができます。 WebSocket接続。

従来のHTTP接続の場合と同じように、新しい接続(つまり、ログインしているユーザーがこの接続を開いているかどうか)を認証するには、認証Cookieを使用するのが適切です。以下は


、私は、Webソケットの目的は、要求レベルの認証は理にかなっているように、(実際にそれがWebSocketのだ、なぜ私は思ってしまう)一つだけのリクエストを送信するためにであると仮定します。

他のユーザーがこのリンクを共有するだけで、関連のないユーザーがそのリンクにアクセスするのを阻止するものはありますか?

何もありません。あなたを偽装している間に他の誰かが特定の要求を提出してもらいたいですか?そして、是非、それらのリンクを与えて、それを使用するように指示してください。

リンクの認証情報には、API秘密鍵の唯一の所有者として、あなただけが生成できるAPIリクエストのHMAC(あなたのID)が含まれます。そのHMACを他の誰かに渡すと、そのHMACを送信して、その特定の要求に対してあなたを偽装することができます。ただし、さまざまなリクエストに対してより多くのHMAC値を作成するためのAPIシークレットがないため、リクエストを作成することはできません。

実際に、そのリクエストを送信したくない場合は、最初に認証用HMACを作成するために秘密を使用してはいけません。あなたが提出しようとしなかった要求を認証したのはなぜですか?

+0

問題は、別の人にリンクを渡すことによって、WebSocketを開く権限が与えられることです。それが私が防止しようとしていることです。 – Shawn31313

+0

@ Shawn31313あなたが*他の誰かがそれらを偽装することを自発的に許可することは不可能であることを望みますか?これは簡単ではありません。自分の身元を誰かに証明する私の能力を自発的に贈りたいのであれば、私はいつも自分の電子メールパスワードや認証クッキーを渡すことができます。 – apsillers

+0

@ Shawn31313また、誤ってリンクを譲ってしまわないようにしたいのですか?その場合は、クッキーを使用するか、ソケットチャネル内で資格情報を送信してその情報を伝達してください。 – apsillers