2009-07-19 7 views
2

私はdjangoのサービスとして小さなアプリケーションを構築していますが、今はそれを一部のクライアントPHP Webアプリケーションに統合する時です。DjangoシングルサインオンとPHPサイト:クロスドメインログイン?

クライアントドメインwww.a.comのは、ユーザーの認証を処理し、おそらくセッションにCookieを使用します。

自分のドメインのログインしているユーザーを、私のDjangoアプリケーションのdommain www.b.com/clientA/にログインさせるにはどうすればいいですか?

私はドメインにrelogginを作成し、ドメインAで認証チェックの認証バックを使う方法を見ていますが、これはユーザーがwww.a.comとwww.b.comでログイン/パスを2回入力する必要があることを意味します。 com。

セキュリティ上の理由から、ドメインwww.a.comからのクッキーへのアクセスは不可能だと思います。

これはどのように処理しますか?

+0

PHPアプリケーションをオプションで変更していますか? – oggy

+2

BTW、適切な用語は "Djangonauts" –

答えて

7

別のドメインのCookieにアクセスできないと仮定しても問題はありません。ただし、サブドメインにある場合は、正しく設定されていればアクセスできます。

完全に別のドメインに置いておかなければならない場合は、ややこしいでしょう。既存のPHPコードを変更できない場合は、かなり忘れてしまいます。

1つのオプションは、OpenIDを使用しています。これは、PHPとPythonで使用できるOpenIDライブラリがあるため、これに取り組む最も簡単な方法です。 OpenIDは、認証のようなシングルサインを持つことができます。すでにさまざまなサイトで使用されているため、証明されています。

カスタムシングルサインオンシステムを作成することもできます。

基本的な考え方は、ユーザーがサイトに到着したときに、ユーザーをログインサイトに誘導することです。これは、PHPやPythonの最後のものでも、別々のものでも、別々のものでもかまいません。ここでは、ユーザーがサインインし、ログインすると秘密キーが生成されます。これはハッシュ、ランダムな文字列、予測できないものであればどんなものでもよく、ユーザーはキーでメインサイトにリダイレクトされます。

メインサイトでは、ユーザーにキーがあることが表示され、ユーザーのキーを確認するためにバックグラウンドでログインサイトに要求が送信されます。

ユーザーは1つのサイトにログインしています。ユーザーが2番目のサイトにアクセスすると、ユーザーもログインサイトにリダイレクトされます。ユーザは既にログインしているので、ログインサイトはユーザを新しい秘密鍵でリダイレクトし、2番目のサイトはログインサイトからそれを確認し、別の時間にユーザの資格情報を入力することなくログインします。

+0

クライアントのほとんどはすでに自身の認証スキーマを持っており、openidを使用しません。 3番目のセントラルログインサイトを持つ最後のソリューションが好きですが、PHPコードを提供していない限り、クライアントで多すぎる変更が必要な場合を除きます。 – coulix

+0

2番目のオプションとして、クライアントの既存のPHP認証を利用することができます。シークレットを生成して他のサイトと話すことができるように、変更するだけです。 –

+0

小さな質問が1つわかりません。ログインページに私に秘密のキーが与えられたら、私は元のページにGET varとして渡します。今、私はAjaxで、このキーをチェックできるかどうかを尋ねるロギングページのドメインにリクエストしますか? それは有効なものと答えたでしょうか?ドメインにユーザーをログするにはどうすればよいですか? – coulix

1

HTTPリダイレクトを前後に使用できます。ユーザーがwww.b.comにアクセスし、Cookieが設定されていない場合はwww.a.com/crosslogin?return_to=URL&challenge=stuffにリダイレクトします。 a.comではクッキーを確認し、設定されている場合はURL?verified=otherstuffにリダイレクトします。

これは、ユーザーが認証を偽装するのを防ぐためには、チャレンジレスポンス暗号が必要です。 a.comとb.comは共有秘密情報を設定する必要があり、その秘密情報は暗号化されています。 otherstuffもその秘密で暗号化されています。解読されると、それはタプル(stuff、user)を与えます。 b.comは、otherstuffを一度しか使用できないように再生キャッシュを保持する必要があります。ヤニHartkainenとして使用オープンIDが提案

1):

0

は、私は、次のオプションを参照してください。それが最善の解決策になるかもしれない。

2)HTTPリバースプロキシを経由して一つのドメインを使用しますPHPアプリケーションと同じドメイン上のDjangoアプリケーションの両方を入れて

利用リバースHTTPプロキシを。これにより、PHPアプリケーションのセッションCookieにアクセスできます。

djangoアプリケーションでphpセッションIDを取得すると、セッションCookieを設定してPHPアプリケーションへのリクエストを実行し、誰がログインしているかを確認します。 残念ながら、これはhtmlスクラップやPHPアプリケーションログインしたユーザーの名前が返されます。 ログインしたユーザーを取得すると、djangoアプリケーションでそのユーザーを認証できます。

3)GET経由して渡されたPHPのセッションID:

あなたのDjangoのアプリへのリンクにパラメータとしてセッションIDを追加するには、PHPアプリケーションを変更します。例えば 次のようにあなたのウェブサイトを参照するようにクライアントを尋ねる:

<yourwebsite.com>/?client_session_id=<session_id>&client_name=<client_name> 

あなたはセッションIDを取得するとポイント2

6

で説明したように、ユーザーを認証することができます[OK]を、これはジャンゴを認証する方法ですPHPからのユーザ、またはPHPからDjangoのパスワードを "読み込む"方法。

私はOpenIDのが最善の解決策だと思うが、私は今日、同じデータベースを共有するPHPアプリにDjangoのユーザを認証するために持っていたし、これは私が解決方法です:

<?php 

/* Generates crypted hash the same way as Django does */ 
function get_hexdigest($algorithm, $salt, $raw_password) { 
    if (!array_in($algorithm, array('md5', 'sha1'))) { 
     return false; 
    } 
    return $algorithm($salt.$raw_password); 
} 

/* Checks if password matches the same way Django does */ 
function check_password($raw_password, $django_password) { 
    list($algorithm, $salt, $hsh) = explode('$', $django_password); 
    return get_hexdigest($algoritm, $salt, $raw_password) === $hsh; 
} 

?> 

をキーにしたフォーマットを理解することですDjangoはあるパスワードを保存します。だから、例えば私はAUTH_USER行のパスワード「管理者」と「管理者」のユーザーとパスワードのフィールドを持っていた

[アルゴリズム] $ [塩] $ [ハッシュ]

あった:

sha1$63a11$85a93f217a72212b23fb0d5b95f3856db9575c1a 

アルゴリズムは「sha1」、ランダムに生成されたsaltは「63a11」、暗号化されたハッシュは「85a93f217a72212b23fb0d5b95f3856db9575c1a」です。

だから、あなたは誰がPHPで暗号化されたハッシュを生成しますか?あなたは簡単に塩と生のパスワードを連結し、アルゴリズムでハッシュします。この場合、sha1:

<?php 

$salt = '63a11'; 
$pass = 'admin'; 

echo sha1($salt.$admin); // prints "85a93f217a72212b23fb0d5b95f3856db9575c1a" 

?> 

これは難しくありませんでした。私はDjangoソースの関連するコードを読むことでそれを得ました。

関連する問題