2011-01-28 6 views
3

私はPHPで書かれたサイトを持っており、PythonとDjangoを使って新しい機能を追加しています。これの一部は、標準のcontribs.authパッケージを使用したDjango認証になります。私はPHPでDjangoユーザ認証を使用しています。このCookieベースの認証方式は安全ですか?

私たちのDjangoセットアップを使用してログインしたら、PHP側に来たら、ログインしていることを確認してデータベースからユーザー情報を使用する必要があります)。

ユーザIDを取得し、このDjangoのsessionidのクッキー値を使用して、DjangoセッションIDがPHPから有効であることを証明する最良の方法は何ですか?

私の計画は、ログイン時にDjangoセッションID、私のDjango秘密鍵、およびユーザーIDのハッシュを作成することです。その値は追加のCookieとして設定されます。 PHPで、私はユーザーIDを抽出し、そのハッシュと秘密鍵とDjangoのsessionidのクッキー値を作り、それらが一致するかどうかを比較します。

ユーザーが正常に認証されると、認証ログインビューを拡張して追加のCookieを設定しました。 HttpResponseRedirectの代わりに、HttpResponseSetAuthCookieAndRedirectを返します。

HttpResponseSetAuthCookieAndRedirectは、request.session.session_idとuser_idを引数として取得します。

class HttpResponseSetAuthCookieAndRedirect(HttpResponse): 
    """ a cookie enhanced version of HttpResponseRedirect """ 
    status_code = 302 

    def __init__(self, user_id, session_id, redirect_to): 
     HttpResponse.__init__(self) 
     self['Location'] = iri_to_uri(redirect_to) 

     my_hash=hashlib.sha512('{0}|-|{1}|-|{2}'.format(settings.SECRET_KEY,user_id,session_id)).hexdigest() 

     cookie_hash="{0}::{1}".format(user_id,my_hash[:64]) 

     self.set_cookie('check', value=cookie_hash, max_age=172800, path='/', domain=None) 

これは、セッションID、私のジャンゴ秘密鍵、およびセッションIDと一致する認証されたユーザIDのハッシュでクッキーを設定します。 PHPで

$check_cookie=$_COOKIE['check']; 
$django_cookie=$_COOKIE['sessionid']; 

$check_cookie=str_replace('"','',$check_cookie); 
$django_cookie=str_replace('"','',$django_cookie); //they have quotes for some reason 

$parts=explode('::',$check_cookie); 

$sent_user_id=(int)$parts[0]; 
$sent_hash=$parts[1]; 

$cookie_hash=hash('sha512',"$secret_key|-|$sent_user_id|-|$dj_cookie_sessionid"); 
$reconstructed_security_hash=$sent_user_id.'::'.substr($cookie_hash,0,64); 

if($reconstructed_security_hash==$cookie_hash) 
    { 
    return $sent_user_id; //cookies are valid, and user id is the one set by Django for this session id. 
    } 

return false; //cookies do not match 

これは、これまでに取り組んでいます。

このアイデアは鳴りますか?

+0

私はちょっとDjangoの新機能です(セッションIDの値でデータベースに保存されているセッションを調べるなど)。 – Cole

答えて

3

Djangoがセッションを中断した場合に、Djangoがセッションを中断した場合、関連するセッションデータを直接データベース(cookieのセッションIDを使用)で取得し、ユーザーが記録した直接情報を取得できますもしあれば、Djangoサイトにあります。

EDIT:

ここでDjangoが使用する "暗号化" です:

http://code.djangoproject.com/browser/django/tags/releases/1.2.4/django/contrib/sessions/backends/base.py#L86

あなたのような何かを得るべきである "解読" した後:

{ 
    '_auth_user_id': 123, 
    '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend', 
} 

を - プラスのコース他自分で設定したセッションデータ

+0

いいですね、それからセッションストレージを使うことができました。セッションデータを単に節約するかどうか知っていますか? Base64もエンコードされているようです。 Djangoのドキュメントでは、セッションデータが「暗号化されています」と書かれています。 – Cole

+0

上記で追加したリンクを見てください。 –

+0

情報ありがとうございます。セッションデータにアクセスするのが最善の考えです。 – Cole

0

別の方法で動作する、つまりPHPアプリケーションにログインしてこのログイン情報を使用してDjangoアプリにログインすることができるソリューションを構築できるかどうかは分かりますか?

+0

実際に私のasnwerのメソッドを使用して、あるサイトから別のサイト(Djangoベース)にログを記録しました。そう、確かに可能です。 –

+0

"あなたは本当にそれを自分の質問(...)として掲示するべきです" @コールOK、間違った場所に質問を掲載して申し訳ありません。 –

+0

はい:この質問を参照してください。 http://stackoverflow.com/questions/5023762/token-based-authentication-in-django – tobych

関連する問題