在REST api中验证令牌

时间:2015-10-04 10:35:37

标签: php rest authentication token

我有一个简单的问题,我有使用我的PHP REST api的js应用程序(前端)。我需要实现简单的基于令牌的身份验证,我不知道这应该如何工作,因为我不在REST中使用会话。从我的不足看,它是这样的:

  1. 用户尝试登录,如果有效凭据,我生成令牌并返回带有令牌的用户对象

  2. 我在数据库中更新用户令牌

  3. 客户端将用户对象保存在cookie或本地存储中而不是会话中,并且每个请求都会在标题中传递令牌

  4. 我检查数据库中是否有令牌,如果有(我知道哪个用户正在发送请求)我继续请求,否则我将他发送到登录页面

  5. 如果令牌过期或用户注销,我更新DB中的令牌字段为NULL或空字符串(不确定是否需要)。

  6. 我只是需要确认,如果这是正确的方法或我误解了协议中的东西。 提前谢谢大家

    谢谢

2 个答案:

答案 0 :(得分:4)

我不认为这种做法是无国籍的。令牌的存在表示登录状态。这意味着客户端状态的一部分由服务器维护。换句话说,服务器上的令牌计数会因客户端会话而增加。

  

从客户端到服务器的每个请求都必须包含所有信息   必须了解请求,并不能利用任何   存储的上下文在服务器上。因此,会话状态完全保留   在客户端上。     - Fielding - REST - stateless

我宁愿做这样的事情:

  1. 首先使用auth发送用户名和密码,然后返回包含服务器签名的元数据的令牌。
  2. 通过其他所有请求发送令牌,以便服务器能够验证签名并使用元数据,其中包含例如用户ID,到期日期等...
  3. 在令牌过期前更新。
  4. 定期更新签名机制的私钥。
  5. 使用内存缓存缓存身份验证和授权数据。我认为db太慢了。请注意,整个过程必须在没有缓存的情况下工作。因此,如果清除缓存并发送另一个请求,并且由于缓存丢失而无效,则会违反无状态约束。
  6. 这样您就可以避免在服务器上存储令牌(以及客户端状态)。不是一个完美的解决方案(例如,令牌在其过期之前可以被其他人使用)但它是无状态的。我不确定您是否真的需要REST或基于令牌的身份验证。 (请注意,这些适用于人机交流。机器与机器之间的通信通常有不同的授权。)

答案 1 :(得分:0)

无国籍。这意味着REST服务器不会以会话或任何其他形式存储有关客户端的任何状态。

我个人使用类似这样的应用程序,这是您可以拥有的最简单的安全形式。

当我们的系统用于发出访问令牌时,它也会创建一个到期日期/时间。每当您使用特定的访问令牌进行呼叫时,其到期日期/时间会更新+ n小时