2012-02-26 17 views
1

認証用にPHPアプリケーション(P)を使用したいDjangoアプリ(D)があります。つまり、ユーザーはDにログインし、Pでサービスを呼び出してパスワードを確認します。また、ローカルユーザーアカウントを使用して、それらのプロパティをDに格納する必要があります。実際のセキュリティ要件は非常に低いです。 DがPのデータベースに直接アクセスすることは非常に困難です。PHPで認証APIを実装する

  1. D:(Pと同じアルゴリズムを使用して)、計算ハッシュをユーザー名とパスワードを収集し
  2. D:Webサービスを呼び出します(HTTP

    私はこのような何かを考えていた、いずれかの認証を実装したことがないので)on P、ユーザー名とハッシュを渡す

  3. P:ユーザー名を検索し、存在しなければ失敗します。
  4. P:そうした場合、渡されたハッシュに対して保存されたハッシュをチェックし、違う場合は失敗します。
  5. P:[OK]場合は、ユーザレコード
  6. Dを更新/作成:[OK]をする場合は、ユーザー(例えば、氏名、いくつかのドメイン固有のもの)に関するいくつかの他の情報を返すが、それ以外
  7. Dを失敗返します。 OKならば、それらをログに記録

をので、いくつかの質問:このアプローチは賢明な

  • ですか?どのような攻撃が(クライアントに知らせるために)脆弱ですか?
  • P:認証プロバイダで追加される機能とは何ですか?
  • 標準のプロトコルを使用するか、少なくともWebサービスコール名を使用して、このようなことを行う標準的な方法はありますか?
  • ステップ6は合理的なアプローチですか?この方法でユーザーデータベースを同期させることには欠点がありますか?
+0

PHPアプリケーションと同じローカルネットワーク上にあるDjangoアプリケーションをホストしているサーバーは、またはインターネット経由で認証していますか? –

+0

同じローカルネットワーク(同じ機関内で、とにかく)。 –

答えて

0

両方のサーバーが同じ機関/ネットワークに存在することに言及しているので、プレーンHTTPの代わりにHTTPSを使用することを条件として、認証は機能します。あなたはDjangoがハッシュとしてPHPのハッシュが同じであることを確認することができない限り

D: Collect username and password, compute hash (using same algorithm as P) 

、私はあなたが上でパスワードを送信することをお勧めします(ただし、プレーンHTTPを介して、ポイント2を参照)。あなたは2台のサーバーが直接接続されていることが確実であれば

Call web service (HTTP) on P, passing username and hash 

あなただけのプレーンなHTTPを使用する必要があります。そうしないと、(ハッシュされた)パスワードをクリアに送信する典型的なWeb攻撃(例えばMan-in-the-middle)の影響を受けやすくなります。私は、PHPアプリケーション側では、ハッシュが同じであることを直接検証していると仮定しています。ネットワーク状態が不明な場合は、HTTPS経由でWebサービスを呼び出していることを確認してください。

P: Look up username, fail if it doesn't exist. 
P: If it does, check stored hash against passed hash, fail if different. 
P: If ok, return some other information about the user (eg, full name, some domain-specific stuff), otherwise return fail 
D: If ok, create/update the user record 
D: If ok, then log them in. 

これらの手順は罰金ですが、2つのデータベース間で一定のユーザー同期を探しているなら、あなたはあなた自身のユーザデータベースを更新する方法を見つける必要があります。 PHPアプリケーションがユーザを無効/削除する場合、Djangoアプリケーションはその変更を受け取る必要があります。削除されたユーザがDjango側にログインすることを許可します。

この問題を解決するための2つの方法があります。

  1. 投票X分ごと/時間メッセージングシステム(例えばRabbitMQの)を使用し、ユーザのステータスが
  2. 同じであることを確認するためには、すべての変更ようにPHP側で公開され、Django側で受信されます。

最初の方法は、ユーザーが次回の投票前にDjango側でログインすることができるので、効率的で安全な方法ではありません。これは、セキュリティが重要ではなく、少数のユーザーしか存在しない場合に推奨されます。

2番目の方法は優れていますが、同期を管理するためのコードを書く必要があります(PHPとDjango)。この方法は、PHPアプリケーションのユーザーの変更を直ちに追跡して自分のデータベースに反映させることができるので、ずっと優れています。ユーザーがDjangoアプリケーションを使用していない場合、PHP側のユーザーの変更を無視できますあなたの側の記録)。

関連する問題