PHP会话和唯一用户令牌


PHP Sessions and Unique User Tokens

我想在PHP中实现一个像OAuth这样的东西,我想做的是给用户令牌,这样他们就可以使用他们的私有资源。每个用户首先必须使用他们的电子邮件和密码登录,并获得一个唯一的令牌,该令牌将永远有效,除非闲置"n"分钟。因此,如果在"n"分钟内没有请求,则应该销毁令牌。该令牌将用于用户访问私有资源。

我能想到的一件事是……

我将维护一个名为user_tokens的db表,当他们使用用户名和密码登录时,将在那里创建具有唯一令牌的条目。最后一次访问的时间戳将被设置,用户将获得唯一的令牌作为响应。令牌现在可以用于访问用户的私有资源,并且需要与所有需要令牌的请求一起传递。每个私有请求都会检查最后一个时间戳和当前时间戳是否有"n"分钟的差异,如果是,则销毁令牌。否则,发送请求资源的响应,并将最后时间戳设置为当前时间戳。

明白了吗?或者还有其他更有效的方法?

我想补充的是,令牌必须像twitter或facebook从他们的API返回。

如果你想用库实现OAuth,你应该看看Digg的Jeff Hodson的HTTP_OAuth pear包[1],在这个网站上有很多关于使用OAuth的数据库设计的好文章[2]。

我想我对你的问题感到困惑。你是想为你的web应用程序做一个API,还是只是提供一种保护用户资源的方法?如果你想做一个API,你绝对应该使用OAuth和一个知名的库。这样做将确保:
    其他开发人员将知道如何使用您的API,因为它遵循OAuth RFC[3]
  1. 你的web应用更有可能是安全的
  2. 你意识到最好的做法,并学习一些新的东西

如果你不想做一个API,只是想保护用户资源,我认为你会使用会话[4]是安全的,如果用户没有登录,他们无法访问受保护的资源。

[1] HTTP_OAuth Package: http://pear.php.net/pepr/pepr-proposal-show.php?id=607
[2] Oauth数据库设计:Oauth Provider的推荐数据库结构是什么
[3] Oauth RFC: http://oauth.net/
[4] PHP会话:http://us2.php.net/manual/en/features.sessions.php

我使用session_regenerate_id来生成令牌,在我使用session_id之前,但我已经弄清楚使用session_id的sessID从未改变值,然后再生它是适合我的解决方案。

现在我甚至可以控制是否有相同的用户但使用不同的sessID,并提供注销一个用户会话的选项。

我不知道它是否正是你要找的,但它解决了我关于TOKEN的问题。而且永远不会再发生。

参考:https://www.php.net/manual/en/function.session-regenerate-id.php