PHP会话和唯一用户令牌

时间:2011-12-15 14:28:18

标签: php oauth http-authentication

我正在尝试在PHP中实现类似OAuth的功能,我想要做的是向用户提供令牌,以便他们可以使用他们的私有资源。每个用户首​​先必须使用他们的电子邮件和密码登录并获得一个永久有效的唯一令牌,除非它在“n”分钟内闲置。因此,如果“n”分钟的请求为零,则应销毁该令牌。该令牌将用于访问用户的私有资源。

我能想到的一件事是......

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

这有意义吗?或者可以有另一种有效的方法来做到这一点?

我想补充一点,令牌必须与Twitter或Facebook从其API中退回的内容一样。

2 个答案:

答案 0 :(得分:0)

我使用session_regenerate_id生成令牌,在我使用session_id之前,但我发现使用session_id sessID从未更改过值,然后重新生成它一个适合我的解决方案。

现在我甚至可以控制是否有相同的用户但是使用不同的sessID,并为LogOut选择一个用户的会话。

我不知道它是否正是您所寻找的,但它解决了我关于TOKEN的问题。它永远不会重复。

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

答案 1 :(得分:0)

如果您正在寻找使用库实现OAuth,您应该查看Digg [1]的Jeff Hodson撰写的HTTP_OAuth pear包,并且该网站上有一些关于数据库设计的好帖子与Oauth一起使用[ 2]。

但是,我认为我对你的问题感到困惑。您是要为您的Web应用程序制作API,还是仅提供保护用户资源的方法?如果你想制作一个API,你绝对应该使用OAuth并使用一个众所周知的库。这样做将确保:

  1. 其他开发人员将知道如何使用您的API,因为它遵循OAuth RFC [3]
  2. 您的网络应用程序更可能是安全的
  3. 您了解最佳做法并学习一些新内容
  4. 如果您不打算制作API,并且只想保护用户资源,我认为您使用会话[4]是安全的,并且,如果用户未登录,则无法访问受保护的资源。

    [1] HTTP_OAuth包:http://pear.php.net/pepr/pepr-proposal-show.php?id=607
    [2] Oauth数据库设计:what is the recommended database structure for OAuth Provider
    [3] Oauth RFC:http://oauth.net/
    [4] PHP会话:http://us2.php.net/manual/en/features.sessions.php