只使用cookie的auth的最佳方法是什么?

时间:2011-05-20 03:15:49

标签: php authentication cookies

我正在考虑一些方法 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的其他好方法吗?

1 个答案:

答案 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。

相关问题