我已经开始设计RESTful API,我正在考虑如何处理身份验证。我想使用某种身份验证令牌,但我不能使用OAuth o类似的基础架构,所以我必须自己处理它。
此API的一个要求是它必须具有良好的性能,足以在需要扩展之前处理大量请求;我担心的是如何在每个请求上尽可能少地验证令牌(完整性,到期,IP地址等)所需的时间。
我认为令牌应该是某种哈希,而不是包含用户信息的加密字符串,因为解密时间会很长。
我已经读过,我可以将令牌存储在内存哈希表中,其中键是令牌,值是处理请求所需的用户信息,但是如何在集群环境中使用每个“节点”上都会有一个哈希表吗?
我是否应该在数据库表上放置令牌,每次点击数据库还是手动处理过期票据的保留?
对于这个问题可能并不重要,但我正在使用Spring MVC作为RESTfull API。
提前致谢。
答案 0 :(得分:5)
我通过使用内存缓存和数据库缓存解决了我的问题。以下是我的解决方案的摘要,可以帮助任何具有相同任务的人。
这提供了良好的性能和安全性,令牌可以使用任意算法生成,即使是相对较慢的算法,因为您不必在每次api调用时重新计算它。此外,这也适用于可以横向扩展的无状态服务。
答案 1 :(得分:3)
我假设您使用https,因此所有流量都已加密。我建议采用以下原则之一。
基本身份验证
您可以在请求的Authorization标头中添加凭据。此凭据使用Base64编码(请参见下文)。可以在每个请求上发送此凭据,然后使用您的数据库进行检查。为了更快,更少IO,您仍然可以使用缓存。一旦我在没有缓存的情况下实现了这样的API,并且每秒能够处理数千个请求。
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
授权令牌
使用令牌实现您的想法有不同的方法。一个常见的问题是,每个API用户都有自己的令牌,通常称为api密钥,永不过期。另一个是你首先必须授权(基本身份验证),然后获得一个到期的令牌。然后将这个用作api密钥一段时间。
无论哪种方式,您都必须决定是否使用缓存。我会保持简单,并进行基本身份验证并每次检查数据库。几乎每个框架都对这种方法有很好的支持,因为它简单的http。如果这导致性能问题(我还是建议性能测试),请尝试将包含凭据的表添加到JPA缓存中。如果你想实现一些过期令牌的东西,请看看Infinispan。
答案 2 :(得分:0)
您可以在Redis中存储令牌。如果要将其存储在DB中,请确保优化服务器(如果要管理它)以进行读取操作。我有几个实现,其中人们也使用了键值存储。 Hashtable也是个好主意。