我正在考虑一些方法
1.使用用户PK,cookie值:{id}:{md5(id+salt)}
2.使用用户电子邮件,cookie值为{email}:{md5(email+salt)}
3.方式1或2加密码,如{id}:{md5(id+pass+salt)}
,但这种方式将每次(select the password)
选择一个数据库。
还有基于cookie的auth的其他好方法吗?
答案 0 :(得分:0)
你真正想要的是:
id:[some_int],
session_token:[some_hash]
会话令牌仅在服务器上创建,并且只是一个查找键...重要的是,与user_id配对。它存储在具有截止日期的数据库中。一旦到期,您需要新的登录。您可以随时设置超时...更改生成密钥等的方式。您还可以使用不同的超时等不同的auth令牌分类。
在页面加载时,您使用id和会话令牌作为对会话表的查询,通常选择日期范围(取决于您的登录业务规则)。如果一切都匹配,你就是好的。对于额外的混淆,您可以使用部分用户代理。
在这种情况下,如何生成令牌无关紧要...... MD5(mktime())与其他任何东西一样好。
你需要担心预建格式的唯一时间是auth_tokens,它可以用来弥合应用程序之间的API差距。你的网络服务(听起来你不必担心这个)。
示例登录检测流程:
<?php
session_start();
if (array_key_exists('auth_user', $_SESSION))
{
// user already has a session.
}
elseif (array_key_exists('session_token', $_COOKIE))
{
$sql = 'SELECT *
FROM sessions
LEFT JOIN users USING (user_id)
WHERE sessions.user_id = %d
AND sessions.token = \'%s\'
AND [ some date argument ]
LIMIT 1';
// execute SQL. If you get a user back, great. Set up a session.
if (!empty($user))
{
$_SESSION['auth_user'] = $user;
}
}
else
{
// Not logged in. Do what you want here (like show a login UI).
}
您的身份验证代码应创建令牌,将其放入数据库,然后设置cookie。