Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于令牌的RESTAPI身份验证_Rest_Http_Authentication_Basic Authentication_Stateless - Fatal编程技术网

基于令牌的RESTAPI身份验证

基于令牌的RESTAPI身份验证,rest,http,authentication,basic-authentication,stateless,Rest,Http,Authentication,Basic Authentication,Stateless,我有一个由轻量级Node.js API备份的移动应用程序。我最近开始探索集成使用基于令牌的身份验证的第三方API服务。此API专为从我的服务器端Node.js代码调用而设计,因为直接从我的移动应用程序调用它会暴露我的敏感用户名/密码信息。其他类似的API只能被称为服务器端(例如Stripe),它们需要使用随每个请求传入的密钥进行身份验证。这种方法对我来说更有意义,因为您实际上并不认为服务器“登录”到另一个API 因此,以下是关于访问基于令牌的API的问题: 调用此API的最佳方法是什么?令牌的生

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

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

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

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

  • 我将从#2开始:

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

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

  • 也是一种象征
  • 实际上并不“让您登录”。它也是无状态的,因为每次请求都会传递用户名和密码
  • 因此,在本例中,您描述的令牌和密码之间的区别实际上是关于令牌的生存期。听起来你可能有两个代币。一个用于执行请求(访问令牌),另一个用于在访问令牌过期时请求新的访问令牌(刷新令牌)

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

    访问令牌可能会泄漏到日志中,或者通过其他方式意外暴露。刷新令牌被公开的几率更低

    一些API也在一些签名json有效负载(jwt)中转换访问令牌,因此它们不需要检查数据存储的有效性。在安全更改(新密码、入侵检测)的情况下,这些服务可能会使刷新令牌过期,但不会使访问令牌过期


    但这是一个有点毛茸茸的话题。没有明确的攻击向量通过创建两个令牌而被阻止,但它是深度防御。

    < P>自从回答了问题2,我将从问题1

    开始。 对于基于令牌的身份验证,如您所述,对于每个请求,您都可以拦截实际请求并验证令牌,如果令牌有效,您可以允许请求访问api。 最近,有一个新的标准叫做 Json web标记。下面是关于JWT的描述

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

    IO允许您解码、验证和生成JWT

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

    现在是问题2


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

    回答得好!刷新令牌被公开的几率较低,这仅仅是因为您使用它的频率较低?是的,它在不同的上下文中使用。可能会转到其他服务器,这可能更安全。在我的情况下,我的服务器是访问第三方API的客户端。我的服务器从另一个API请求令牌。