我有一个简单的问题,我有使用我的PHP REST api的js应用程序(前端)。我需要实现简单的基于令牌的身份验证,我不知道这应该如何工作,因为我不在REST中使用会话。从我的不足看,它是这样的:
用户尝试登录,如果有效凭据,我生成令牌并返回带有令牌的用户对象
我在数据库中更新用户令牌
客户端将用户对象保存在cookie或本地存储中而不是会话中,并且每个请求都会在标题中传递令牌
我检查数据库中是否有令牌,如果有(我知道哪个用户正在发送请求)我继续请求,否则我将他发送到登录页面
如果令牌过期或用户注销,我更新DB中的令牌字段为NULL或空字符串(不确定是否需要)。
我只是需要确认,如果这是正确的方法或我误解了协议中的东西。 提前谢谢大家
谢谢
答案 0 :(得分:4)
我不认为这种做法是无国籍的。令牌的存在表示登录状态。这意味着客户端状态的一部分由服务器维护。换句话说,服务器上的令牌计数会因客户端会话而增加。
从客户端到服务器的每个请求都必须包含所有信息 必须了解请求,并不能利用任何 存储的上下文在服务器上。因此,会话状态完全保留 在客户端上。 - Fielding - REST - stateless
我宁愿做这样的事情:
这样您就可以避免在服务器上存储令牌(以及客户端状态)。不是一个完美的解决方案(例如,令牌在其过期之前可以被其他人使用)但它是无状态的。我不确定您是否真的需要REST或基于令牌的身份验证。 (请注意,这些适用于人机交流。机器与机器之间的通信通常有不同的授权。)
答案 1 :(得分:0)
无国籍。这意味着REST服务器不会以会话或任何其他形式存储有关客户端的任何状态。
我个人使用类似这样的应用程序,这是您可以拥有的最简单的安全形式。
当我们的系统用于发出访问令牌时,它也会创建一个到期日期/时间。每当您使用特定的访问令牌进行呼叫时,其到期日期/时间会更新+ n小时