在RESTful API中存储身份验证令牌的位置

时间:2013-10-16 21:25:17

标签: api rest authentication token

我已经开始设计RESTful API,我正在考虑如何处理身份验证。我想使用某种身份验证令牌,但我不能使用OAuth o类似的基础架构,所以我必须自己处理它。

此API的一个要求是它必须具有良好的性能,足以在需要扩展之前处理大量请求;我担心的是如何在每个请求上尽可能少地验证令牌(完整性,到期,IP地址等)所需的时间。

我认为令牌应该是某种哈希,而不是包含用户信息的加密字符串,因为解密时间会很长。

我已经读过,我可以将令牌存储在内存哈希表中,其中键是令牌,值是处理请求所需的用户信息,但是如何在集群环境中使用每个“节点”上都会有一个哈希表吗?

我是否应该在数据库表上放置令牌,每次点击数据库还是手动处理过期票据的保留?

对于这个问题可能并不重要,但我正在使用Spring MVC作为RESTfull API。

提前致谢。

3 个答案:

答案 0 :(得分:5)

我通过使用内存缓存和数据库缓存解决了我的问题。以下是我的解决方案的摘要,可以帮助任何具有相同任务的人。

  • 用户登录并在此时生成唯一密钥并将其发送回用户。
  • 登录令牌(基本上是具有某些处理的GUID)也存储在db表中,其中包含exipiration等附加信息以及用户的信息和角色。同样的信息也存储在内存中(google是密钥的google guava哈希表)
  • 必须将令牌与授权令牌中的每个api调用一起传递为@ipa建议
  • 服务器代码检查令牌是否在其内存缓存中,否则用户信息已经可用(例如,api调用在集群中的另一个节点上完成)令牌将在令牌db中搜索
  • 一旦找到令牌,您就可以检查到期,角色等......

这提供了良好的性能和安全性,令牌可以使用任意算法生成,即使是相对较慢的算法,因为您不必在每次api调用时重新计算它。此外,这也适用于可以横向扩展的无状态服务。

答案 1 :(得分:3)

我假设您使用https,因此所有流量都已加密。我建议采用以下原则之一。

基本身份验证

您可以在请求的Authorization标头中添加凭据。此凭据使用Base64编码(请参见下文)。可以在每个请求上发送此凭据,然后使用您的数据库进行检查。为了更快,更少IO,您仍然可以使用缓存。一旦我在没有缓存的情况下实现了这样的API,并且每秒能够处理数千个请求。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

授权令牌

使用令牌实现您的想法有不同的方法。一个常见的问题是,每个API用户都有自己的令牌,通常称为api密钥,永不过期。另一个是你首先必须授权(基本身份验证),然后获得一个到期的令牌。然后将这个用作api密钥一段时间。

无论哪种方式,您都必须决定是否使用缓存。我会保持简单,并进行基本身份验证并每次检查数据库。几乎每个框架都对这种方法有很好的支持,因为它简单的http。如果这导致性能问题(我还是建议性能测试),请尝试将包含凭据的表添加到JPA缓存中。如果你想实现一些过期令牌的东西,请看看Infinispan。

答案 2 :(得分:0)

您可以在Redis中存储令牌。如果要将其存储在DB中,请确保优化服务器(如果要管理它)以进行读取操作。我有几个实现,其中人们也使用了键值存储。 Hashtable也是个好主意。