私は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
これは、これまでに取り組んでいます。
このアイデアは鳴りますか?
私はちょっとDjangoの新機能です(セッションIDの値でデータベースに保存されているセッションを調べるなど)。 – Cole