【问题标题】:what is the best way of the auth which is only using the cookie?仅使用 cookie 的最佳身份验证方式是什么?
【发布时间】:2011-05-20 14:00:16
【问题描述】:

我正在考虑一些方法。
1.使用用户PK,cookie值:{id}:{md5(id+salt)}
2.使用用户邮箱,cookie值:{email}:{md5(email+salt)}
3.方式1或2加密码,如{id}:{md5(id+pass+salt)},但是这样每次(select the password)都会做一个db select。

还有其他基于 cookie 的身份验证的好方法吗?

【问题讨论】:

  • 有什么理由避免会议?
  • @zerkms:RESTful 实现? :)
  • @Demian Brecht:REST 与 cookie 有什么关系?我见过的所有 API 都使用 get/post-parameters 来通过身份验证。
  • @zerkms:这是有争议的,但由于会话使用服务器资源,所以严格来说不是 RESTful。
  • @Demian Brecht:RESTful API 也不使用 cookie。所以对我来说仍然没有意义。顺便说一句,数据库是服务器资源吗?因此,如果 RESTful 应用程序使用数据库(或任何持久存储) - 它应该不是 RESTful 的?!

标签: php authentication cookies


【解决方案1】:

你真正想要的是:

  id:[some_int],
  session_token:[some_hash]

会话令牌仅在服务器上创建,只是一个查找键...重要的是,与 user_id 配对。它存储在数据库中,并带有到期日期。一旦到期,您需要重新登录。您可以随时设置超时...更改生成密钥的方式等。您还可以使用具有不同超时等的不同类别的身份验证令牌。

在页面加载时,您使用 id 和会话令牌作为对会话表的查询,通常使用日期范围选择(取决于您的登录业务规则)。如果一切都匹配,你很好。对于额外的混淆,您可以使用部分用户代理。

在这种情况下,如何生成令牌并不重要...... MD5(mktime()) 和其他任何东西一样好。

您唯一需要担心预构建格式的是 auth_tokens,它可用于弥合应用程序和您的 Web 服务之间的 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。

【讨论】:

  • 你的意思是会话表有一个列'id'来存储用户ID?以及在哪里存储到期日期?用户表?
  • 是的。 session 表至少有 3 列:id、token 和 issue_date。 ID 和令牌是强配对的——只有用户 A 可以使用用户 A 的令牌。
  • 但是session过期30分钟,如何保持一年的auth状态?
  • 另请注意...通常,ID 是索引的,但 不是 主键。这样,同一用户可以为不同的计算机保留令牌。
  • 这不是 apache 的“会话”(它与 $_SESSION 无关,除非您可能希望在用户出现正确的 id/key 组合后调用它。这是一个基于数据库的自定义“会话”。
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2010-09-06
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多