【发布时间】:2011-06-17 04:41:23
【问题描述】:
我有一个用 PHP 编写的网站,并且正在使用 Python 和 Django 添加新功能。其中一部分将是使用标准 contribs.auth 包进行 Django 身份验证。
一旦有人使用我们的 Django 设置登录,当他们来到 PHP 端时,我需要查看他们是否已登录并使用数据库中的用户信息)。
使用此 Django sessionid cookie 值从 PHP 获取用户 ID 并证明 Django 会话 ID 有效的最佳方法是什么?
我的计划是在登录时对 Django 会话 ID、我的 Django 密钥和用户 ID 进行哈希处理。该值将设置为附加 cookie。然后在 PHP 中,我将提取用户 id,对其和密钥加上 Django sessionid cookie 值进行哈希处理,然后比较它们是否匹配。
我扩展了身份验证登录视图,以便在用户成功通过身份验证后设置一个额外的 cookie。它将返回 HttpResponseSetAuthCookieAndRedirect,而不是 HttpResponseRedirect。
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)
这会设置一个 cookie,它是会话 ID、我的 Django 密钥以及与会话 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 还很陌生,所以如果有更好的方法来做到这一点(比如通过 sessionid 值查找存储在数据库中的会话),我愿意接受建议.
标签: php python django authentication cookies