2016-12-09 105 views
1

我有一个由轻量级Node.js API备份的移动应用程序。我最近开始研究集成使用基于令牌的身份验证的第三方API服务。此API旨在从我的服务器端Node.js代码中专门调用,因为直接从我的移动应用程序调用它会暴露我的敏感用户名/密码信息。其他类似的API只能被称为服务器端(例如Stripe)需要使用每个请求传入的密钥进行身份验证。这种方法对我来说更有意义,因为你并不真正想到服务器“登录”到另一个API。基于令牌的REST API身份验证

所以,这里是我的关于访问基于令牌的API的问题:

  1. 什么是打电话到该API的最好方法?该令牌具有1小时的使用寿命。我应该1)将令牌持久存储在数据库中,并且对于每个请求,从数据库中取出令牌,检查它是否仍然有效,然后向第三方API发送请求?或者,2)每次需要向API发出请求时都请求新的令牌?

  2. 使用基于令牌的认证有什么好处?由于没有登录的概念,并且在请求之间不需要维护状态,使用基本身份验证的简单密钥不会更容易吗?

回答

2

我要开始#2:

什么是使用基于令牌认证的好处?由于没有登录的概念,并且在请求之间不需要维护状态,使用基本身份验证的简单密钥不会更容易吗?

基本身份验证用户名和密码:

  1. 也是一个令牌。
  2. 实际上并不“登录”。它以同样的方式是无状态的,因为每个请求都会传递用户名和密码。

所以在这种情况下,您所描述的令牌和密码之间的区别实际上就是令牌的生命周期。这听起来像你可能实际上有2个令牌。一个请求(访问令牌),另一个请求新的访问令牌(刷新令牌)。

为什么这样做?一个想法是刷新令牌是最危险的,因为如果访问令牌以某种方式泄漏,它只会在有限的时间内有效。通过分离这些,你基本上可以减少潜在的攻击媒介的数量。在一切都安全的世界里,这可能没有真正的区别,但我们并不生活在这个世界上。

接入令牌可以泄漏到日志,或偶然通过其他方式获得露出。刷新令牌暴露的可能性更低。

一些API也把访问令牌中,某些已经签署的JSON有效载荷(JWT),所以他们并不需要检查自己的数据存储的有效性。这些服务可能会在安全更改(新密码,入侵检测)的情况下过期刷新令牌,但不会使访问令牌过期。

但是,这是一个多毛的问题。没有明确的攻击向量可以通过创建两个令牌来防止,但它是深度防御。

+0

好答案是多少担保!刷新令牌被暴露的可能性较低,因为您不太经常使用刷新令牌? – toddg

+0

是的,它用在不同的环境中。可能会去一个不同的服务器,这可能会更安全。 – Evert

1

由于问题2回答,我会用问题1

对于基于令牌的认证开始,正如你提到的,对于每一个请求,你可以拦截实际的请求和验证令牌,如果令牌是有效的您可以允许请求访问您的api。 最近有一个叫做JWT 的新标准Json网络令牌。下面是关于JWT

JSON网络令牌是一个开放的,行业标准RFC为双方之间安全地代表索赔7519method描述。

JWT.IO允许您解码,验证并生成JWT。

使用JWT,您可以节省每个请求DB调用。客户端需要在每个请求上发送这个令牌(通常在一个http头中)。在服务器上,拦截请求获取令牌并使用私钥验证令牌并验证用户。令牌可以基于“声明”生成。举例来说,声明可以是客户端IP地址或用户代理或您认为合理的任何内容。我强烈建议你使用的API

你的基于令牌的认证标准JWT现在问题2

是HTTP是意思是无状态协议。尤其是当您使用基于REST的API时,它们必须是无状态的并且会话较少。所以基本认证就足够了。但是,您可能必须进行数据库调用才能验证客户端发送的base64编码的用户名和密码。 JWT令牌的优点是你能避免这种额外的DB调用,不仅仅是基本的认证

+0

就我而言,我的服务器是访问第三方API的客户端。我的服务器从这个其他API请求令牌。 – toddg