在 REST 中验证令牌 api
Validating tokens in REST api
我有一个简单的问题,我有一个使用我的 PHP REST api 的 js 应用程序(前端)。我需要实现简单的基于令牌的身份验证,但我不确定它应该如何工作,因为我不在 REST 中使用 sessions。根据我的理解,它是这样的:
用户尝试登录,如果凭据有效,我生成令牌和 return 用户 object 使用令牌
我更新数据库中的用户令牌
客户端将用户 object 保存在 cookie 或本地存储中而不是 session 并且对于每个请求他都会在 header
[= 中传递令牌33=]
我检查DB里有没有token,如果有(我知道是哪个用户在发送请求)我继续请求,否则我就把他送到登录页面
如果令牌过期或用户注销,我用 NULL 或空字符串更新数据库中的令牌字段(不确定是否需要)。
我只需要确认这是可行的方法还是我误解了协议中的某些内容。
提前谢谢大家
谢谢
通过无国籍。这意味着 REST 服务器不会在会话或任何其他形式中存储有关客户端的任何状态。
我个人曾在应用程序中使用过类似的东西,这是您可以拥有的最简单的安全形式。
当我们的系统用于颁发访问令牌时,它还会创建一个到期时间 date/time。每次您使用特定访问令牌拨打电话时,其到期时间 date/time 更新 +n 小时
我不认为这种方法是无状态的。令牌的存在代表登录状态。这意味着一部分客户端状态由服务器维护。换句话说,服务器上的令牌计数随着客户端会话的增加而增加。
each request from client to server must contain all of the information
necessary to understand the request, and cannot take advantage of any
stored context on the server. Session state is therefore kept entirely
on the client.
- Fielding - REST - stateless
我宁愿做这样的事情:
- 在第一次验证时发送用户名和密码以及return一个由服务器签名的带有元数据的令牌。
- 每隔一个请求发送令牌,这样服务器将能够验证签名并使用元数据,元数据可以包含例如用户 ID、到期日期等...
- 在令牌过期之前更新令牌。
- 定期更新签名机制私钥
- 使用内存缓存缓存身份验证和授权数据。我认为 db 太慢了。请注意,整个过程必须在没有缓存的情况下工作。所以如果你清空缓存再发送一个请求,因为缓存丢失而不能正常工作,那么就违反了无状态约束。
这样您就可以避免在服务器上存储令牌(以及客户端状态)。不是一个完美的解决方案(例如令牌可以在到期前被其他人使用)但它是无状态的。我不确定您是否真的需要 REST 或基于令牌的身份验证。 (请注意,这些适用于人机通信。机器对机器通信的授权通常不同。)
我有一个简单的问题,我有一个使用我的 PHP REST api 的 js 应用程序(前端)。我需要实现简单的基于令牌的身份验证,但我不确定它应该如何工作,因为我不在 REST 中使用 sessions。根据我的理解,它是这样的:
用户尝试登录,如果凭据有效,我生成令牌和 return 用户 object 使用令牌
我更新数据库中的用户令牌
客户端将用户 object 保存在 cookie 或本地存储中而不是 session 并且对于每个请求他都会在 header
[= 中传递令牌33=]我检查DB里有没有token,如果有(我知道是哪个用户在发送请求)我继续请求,否则我就把他送到登录页面
如果令牌过期或用户注销,我用 NULL 或空字符串更新数据库中的令牌字段(不确定是否需要)。
我只需要确认这是可行的方法还是我误解了协议中的某些内容。 提前谢谢大家
谢谢
通过无国籍。这意味着 REST 服务器不会在会话或任何其他形式中存储有关客户端的任何状态。
我个人曾在应用程序中使用过类似的东西,这是您可以拥有的最简单的安全形式。
当我们的系统用于颁发访问令牌时,它还会创建一个到期时间 date/time。每次您使用特定访问令牌拨打电话时,其到期时间 date/time 更新 +n 小时
我不认为这种方法是无状态的。令牌的存在代表登录状态。这意味着一部分客户端状态由服务器维护。换句话说,服务器上的令牌计数随着客户端会话的增加而增加。
each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client. - Fielding - REST - stateless
我宁愿做这样的事情:
- 在第一次验证时发送用户名和密码以及return一个由服务器签名的带有元数据的令牌。
- 每隔一个请求发送令牌,这样服务器将能够验证签名并使用元数据,元数据可以包含例如用户 ID、到期日期等...
- 在令牌过期之前更新令牌。
- 定期更新签名机制私钥
- 使用内存缓存缓存身份验证和授权数据。我认为 db 太慢了。请注意,整个过程必须在没有缓存的情况下工作。所以如果你清空缓存再发送一个请求,因为缓存丢失而不能正常工作,那么就违反了无状态约束。
这样您就可以避免在服务器上存储令牌(以及客户端状态)。不是一个完美的解决方案(例如令牌可以在到期前被其他人使用)但它是无状态的。我不确定您是否真的需要 REST 或基于令牌的身份验证。 (请注意,这些适用于人机通信。机器对机器通信的授权通常不同。)