2015-10-04 116 views
3

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

  1. 用户尝试登录时,如果有效凭据,我生成令牌

  2. 令牌,并返回用户对象我更新数据库用户令牌

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

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

  5. 如果令牌过期或用户注销,我更新数据库中的标记字段与NULL或空字符串(不知道这是否需要)。

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

谢谢

回答

4

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

从客户端到服务器的每个请求都必须包含所有必要了解该请求的信息 ,而不能在服务器上执行任意 存储方面的优势。因此会话状态在客户端完全保持为 。 - Fielding - REST - stateless

我宁愿做这样的事情:

  1. 在第一身份验证发送用户名和密码,并返回一个令牌服务器签名的元数据。
  2. 每隔一个请求发送令牌,以便服务器能够验证签名并使用元数据,其中可以包含例如用户ID,到期日期等...
  3. 更新标记前它到期。
  4. 定期更新签名机制的私钥。
  5. 使用内存缓存缓存认证和授权数据。我认为db太慢了。请注意,整个过程必须在没有缓存的情况下工作。因此,如果清除缓存并发送另一个请求,并且由于缓存丢失而无法工作,那么它违反了无状态约束。

这样你就可以避免在服务器上存储令牌(以及客户端状态)。不是一个完美的解决方案(例如令牌可以在过期之前被其他人使用),但它是无状态的。我不确定您是否真的需要基于REST或基于令牌的身份验证。 (请注意,这些适用于人机对话通信,机器对机器通信的授权通常不同。)

0

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

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

当我们的系统用来颁发访问令牌时,它也随之创建了有效日期/时间。每次您使用特定访问令牌拨打电话时,其有效日期/时间更新+ n小时