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

Nic*_*ola 10 authentication api rest token

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

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

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

我已经读过,我可以将令牌存储在内存中的散列表中,其中键是令牌,值是处理请求所需的用户信息,但是我如何在集群环境中将其设置为有效每个"节点"上的哈希表?

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

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

提前致谢.

Nic*_*ola 5

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

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

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


ipa*_*ipa 3

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

基本认证

您可以在请求的授权标头中添加凭据。此凭据使用 Base64 进行编码(见下文)。该凭证可以根据每个请求发送,然后与您的数据库进行检查。为了获得更快的速度和更少的 IO 密集度,您仍然可以使用缓存。有一次我实现了这样一个没有缓存的 API,并且每秒能够处理数千个请求。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Run Code Online (Sandbox Code Playgroud)

授权令牌

有多种方法可以使用代币来实现您的想法。一个常见的情况是,每个 API 用户都有自己的令牌,通常称为 api 密钥,它永不过期。另一种是您首先必须授权(基本身份验证),然后取回过期的令牌。然后将其用作 api 密钥一段时间。

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