2011-11-09 9 views
15

私は単純なHTTP認証で保護されたこのRESTサーバー(自分で書いたもの)を持っています。Backbone.jsを介した認証済みRESTサーバーへの安全なアクセス?

今、私はbackbone.jsを使ってアプリケーションを書き直しました。クライアントの認証方法についてはわかりません。私はJSのユーザーでそれを行う/パスが表示されます。

サーバーやクライアントサイドのJSをセキュリティで保護するにはどうすればよいですか?

私はちょうどユーザに、RESTサーバへのリクエストごとにPHPでパスしました。ありがとうございました。

答えて

2

これまで:

は、あなたのクライアント側(サイト)で簡単なコントローラを作成し、RESTAPIとしてそれを名前を付け、それだけであなたの実際のRESTサーバーへのラッパーとして機能します。

ときにあなたのサイトにログインすると、彼のセッションの取得の作成。 RESTAPIコントローラは、HTTP認証された実際のRESTサーバーに対する資格情報を認識し、バックボーンに代わってRESTサーバーにヒットします。

例:私は

/メッセージを取得する必要がある場合は/の代わりに私が

サイト/バックボーン・コレクションでこのURLを打つだろう今、RESTサーバーから

を送りましたrestapi /メッセージは、送信/

rESTAPIコンユーザは、要求しているユーザがサイト上で適切なセッションを有していることを最初にチェックし、リソースをフェッチするかどうかを判断する。

安全でないクッキーまたはプレーンJSであなたのRESTサーバーのパスを残したり、他の曖昧な方法:)あなたは、サーバーサイドのRESTコードへのアクセス権を持っている場合は

+1

そのような種類のサーバーの全体的な壊れやすさを破ることはありませんか?私はあなたがそのルートに行くつもりならば、サーバー上でセッション処理を行うだけでもいいということです。私が間違ってはいけない私は毎回信任状を渡して、毎回パスするためにクライアントに保管することは、必ずしも明るい考えではないということについて、私はまだ暗闇の中です。 – thenetimp

+0

すべての要求に資格情報を渡すことについて何も問題はありません。 RESTでは、すべての要求を自己記述可能にする必要があります(サーバー内のセッションの必要性を取り除くため)。リソースが保護されている場合、資格情報は要求 "description"の一部であり、それとともに送信される必要があります。 ユーザーに彼の資格情報を尋ねて、それ以降のすべての要求に渡すことができます。 OPには、セッションを使用しないでください。あなたはそれでRESTの美しさを破壊しています。セッションは必要ありません。セッションを使用しないと、システムのスケーラビリティが大幅に向上します。 – miguelcobain

+0

この実装用に書いたbackbone.jsコードの例を挙げることができますか?私はそれを動作させるのに問題があります。私の進捗状況は[この質問]で見ることができます(http://stackoverflow.com/questions/14752326/adding-http-basic-authentication-header-to-backbone-js-sync-function-prevents-mo) – MusikPolice

29

HTTP基本認証では、盗聴やman-in-the-middle攻撃が発生しやすくなります。 HTTPSを使用することをお勧めします。

ただし、これがオプションでない場合は、クライアントにCookieを送信して、そこにユーザー名とパスワードを入力してJSファイルに表示されないようにすることができます。セキュリティ上の理由からパスワードが少なくとも暗号化/ハッシュ化されている必要はありません。次に、サーバー側でonusがCookieから認証の詳細を取得します。

サーバーサイドコードの変更を制御できない場合は、資格情報の詳細をグローバルajaxSend()メソッドに埋め込む以外の方法はほとんどありません。これは、すべてのユーザー名/パスワードの詳細を送信しますAJAXリクエスト。これを他の.jsファイルに入れて見つけにくくすることもできますが、あなたはそのような形のセキュリティにかなり制限されています。クッキーはあなたの人生をより安全にするものではありません。 (パスワードがハッシュ/暗号化されていると良いでしょう)。

セキュリティのもう少し複雑な形をすることもできます:サーバーがすべての応答でノンスを返すようにします。ノンスはサーバーの秘密鍵を使用してサーバーによって「署名」されます。それを使用して、リクエストごとにクライアント側のユーザ名/パスワードを「暗号化」します。その場合、サーバーは常に資格情報を復号化する必要があります。これは中間者の人にはあまり起こりませんが、それでも絶対確実ではありません。

HTTPSを利用すると、上記のそれぞれからあなたを救うことができます。

これが役に立ちます。

UPDATE(コメントごとなど): 安らかネスの本質は、サーバー上の状態が存在しないことです。私は、セッションがありません!したがって、クライアントがサーバーに対して行うすべての要求でユーザー資格情報を送信する必要があります。ログインページがあれば、ログインと呼ばれる「リソース」がないので、本当に安心できることは非常に難しいです。しかし、ここで何ができるかです:、

  1. ユーザーの訪問は、ページにログイン資格情報とクリックのログイン」を入力する
  2. これらの資格情報を使用してサーバーにPOSTリクエストを送信する - おそらくに/ログイン
  3. サーバーが返す持っています要求されたリソースが認証され、 '次の'要求で使用する有効な資格情報を持つCookieを設定します。
  4. 以降の要求はすべて、特定のアクション(GET、PUT、POST 、DELETE ...)。サーバーは、Cookieから認証データをチェックし、ユーザーが認証されているかどうかを判断し、必要に応じてアクセスを許可するための追加の認証を実行する必要があります。(そして安らかネス;) -

すべての要求は、サーバーがセッションを維持することなく、自分自身を識別しなければならないが、それは無国籍者の精神だ私は私の同僚との議論を持っていたし、最高のアイデアを思い付いたオーケー

+0

詳細な説明をいただきありがとうございます。しかし、申し訳ありませんが、私はサーバーへの完全なアクセス権を持っていると言いました(今編集された質問)ことを忘れてしまいました。それに関する提案はありますか?もしあなたが望むなら、別の答えを書いたり編集したりすることができます。 – BlackDivine

+1

@BlackDivine - 同じ手順を保持する:)私はそれを行うための3つの方法が示されている - クライアントのみ( 'ajaxSend')、サーバのみ(クッキー)とハイブリッドを(一定の暗号化/サーバ・ナンスを使用して復号化) – PhD

+0

私はクッキーオプションのほとんどが好きあなたはこのapporachがより良いことを確認できますか?ユーザーがログインに成功するたびに、我々は、サーバー上のセッションを作成 は、セッションは残りのサーバー上に作成されていれば、セッションが生きているように、ユーザーは、REST APIを使用することができます。 ajaxを使用してログインPOSTを送信すると、サーバーまたは自分のWebサイト上のユーザーのセッションが作成されますか?私は2つのサーバーを持っているので、1つはバックボーンアプリを実行する他のホストのWebサイトをRESTします。どうもありがとう! – BlackDivine

0

は、あなたがREST認証を再設計することができますを使用して、そんなに心配ありません。初めて、httpsを介してユーザー名/パスワードを投稿し、次にセッションIDを取得し、後続のリクエストでこれをCookieとして渡すことができます。

関連する問題