基于令牌的REST API身份验证

时间:2016-12-09 17:44:54

标签: rest http authentication basic-authentication stateless

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

因此,以下是关于访问基于令牌的API的问题:

  1. 调用此API的最佳方法是什么?令牌的生命周期为1小时。我应该1)将令牌持久保存在数据库中,并且对于每个请求,从数据库中提取令牌,检查它是否仍然有效,然后向第三方API发出请求?或者,2)每次我需要向API发出请求时请求新的令牌?

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

2 个答案:

答案 0 :(得分:2)

我将从#2开始:

  

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

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

  1. 也是一种象征。
  2. 实际上并没有“登录你”。它以同样的方式无状态,因为每次请求都会传递用户名和密码。
  3. 因此,在这种情况下,您所描述的令牌与密码之间的区别在于令牌的生命周期。听起来你可能实际上有2个令牌。一个用于执行请求(访问令牌),另一个用于请求新访问令牌(如果它们已过期)(刷新令牌)。

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

    访问令牌可能会泄漏到日志中,或意外通过其他方式暴露。刷新令牌的可能性很低。

    某些API还会在一些签名的json有效负载(jwt)中转换访问令牌,因此他们无需检查其数据存储的有效性。如果安全性发生变化(新密码,入侵检测),这些服务可能会使刷新令牌失效,但不会使访问令牌失效。

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

答案 1 :(得分:1)

由于回答了问题2,我将从问题1开始

对于基于令牌的身份验证,如您所述,对于每个请求,您可以拦截实际请求并验证令牌,如果令牌有效,您可以允许请求访问您的api。 最近,有一个名为JWT的新标准 Json网络令牌。这是关于JWT

的描述
  

JSON Web令牌是一种开放的行业标准RFC 7519方法,用于在双方之间安全地表示索赔。

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

使用JWT,您可以在每个请求上保存数据库调用。期望客户端在每个请求上发送此令牌(通常在http头中)。在服务器上,拦截请求获取令牌并根据私钥验证令牌并对用户进行身份验证。可以基于“声明”生成令牌。例如,声明可以是客户端IP地址或用户代理或您认为合理的任何内容。我强烈建议您使用JWT标准进行基于令牌的API身份验证

现在问题2

是的Http意味着无状态协议。特别是当您使用基于REST的API时,它们必须是无状态且无会话。所以基本的身份验证就足够了。但是,您可能必须进行db调用以验证客户端发送的base64编码的用户名和密码。 JWT令牌的优点是您可以避免这种额外的数据库调用,并且比基本的身份验证

更安全