基于令牌的 REST API 身份验证
Token-based REST API Authentication
我有一个由轻量级 Node.js API 支持的移动应用程序。我最近开始探索集成使用基于令牌的身份验证的第三方 API 服务。此 API 旨在专门从我的服务器端 Node.js 代码调用,因为直接从我的移动应用程序调用它会暴露我的敏感 username/password 信息。其他只能称为服务器端(例如 Stripe)的类似 APIs 需要使用随每个请求传递的密钥进行身份验证。这种方法对我来说更有意义,因为你真的没有想到服务器 "logging in" 到另一个 API.
所以,这是我关于访问基于令牌的问题 API:
调用此 API 的最佳方法是什么?令牌的生命周期为 1 小时。我是否应该 1) 将令牌保存在数据库中,并且对于每个请求,从数据库中提取令牌,检查它是否仍然有效,然后向第三方发出请求 API?或者,2) 每次我需要向 API?
发出请求时请求一个新令牌
使用基于令牌的身份验证有什么好处?由于没有登录的概念,并且请求之间不需要维护状态,使用具有基本身份验证的简单密钥不是更容易吗?
我将从#2 开始:
What is the benefit of using token based authentication? Since there isn't a concept of logging in and no state needs to be maintained between requests, wouldn't it be easier to use a simple secret key with basic auth?
基本身份验证用户名和密码:
- 也是令牌
- 实际上并不'log you in'。它以同样的方式是无状态的,因为用户名和密码会随每个请求一起传递。
所以在这种情况下,您所描述的令牌和密码之间的区别在于令牌的生命周期。听起来您可能实际上有 2 个令牌。一个用于请求(访问令牌),另一个用于请求新的访问令牌(如果它们已过期)(刷新令牌)。
为什么要这样做?一种想法是刷新令牌是最危险的令牌,因为如果访问令牌以某种方式泄漏,它只会在有限的时间内有效。通过将它们分开,您基本上可以减少潜在攻击向量的数量。在一个一切都是安全的世界里,这可能没有什么真正的区别,但我们并不生活在这个世界上。
访问令牌可能会泄漏到日志中,或者通过其他方式意外暴露。刷新令牌暴露的可能性较低。
一些 API 也在一些签名的 json 有效负载 (jwt) 中转换访问令牌,因此他们不需要检查其数据存储的有效性。这些服务可能会在安全更改(新密码、入侵检测)的情况下使刷新令牌过期,但不会使访问令牌过期。
但是,是的,这是一个有点毛茸茸的话题。没有明确的攻击向量可以通过创建两个令牌来阻止,但它是纵深防御。
既然问题 2 已经回答,我将从问题 1 开始
对于基于令牌的身份验证,正如您提到的,对于每个请求,您都可以拦截实际请求并验证令牌,如果令牌有效,您可以允许请求访问您的 api。
最近有一个新标准叫JWT
Json 网络令牌。这是关于 JWT 的描述
JSON Web Tokens are an open, industry standard RFC 7519method for representing claims securely between two parties.
JWT.IO允许您解码、验证和生成JWT。
使用 JWT,您可以在每个请求上保存一次数据库调用。客户端应在每次请求时发送此令牌(通常在 http header 中)。在服务器上,拦截获取令牌的请求并根据私钥验证令牌并对用户进行身份验证。可以根据"claims"生成token。例如,声明可以是客户端 ip 地址或用户代理或您认为合理的任何内容。我强烈建议您将 JWT 标准用于 API
的基于令牌的身份验证
现在问题2
是的 Http 是无状态协议。特别是当您使用基于 REST 的 APIs 时,它们必须是无状态的并且 session 更少。因此,基本身份验证就足够了。但是,您可能必须调用数据库来验证客户端发送的 base64 编码的用户名和密码。 JWT 令牌的优点是您可以避免这种额外的数据库调用,并且比基本身份验证更安全
我有一个由轻量级 Node.js API 支持的移动应用程序。我最近开始探索集成使用基于令牌的身份验证的第三方 API 服务。此 API 旨在专门从我的服务器端 Node.js 代码调用,因为直接从我的移动应用程序调用它会暴露我的敏感 username/password 信息。其他只能称为服务器端(例如 Stripe)的类似 APIs 需要使用随每个请求传递的密钥进行身份验证。这种方法对我来说更有意义,因为你真的没有想到服务器 "logging in" 到另一个 API.
所以,这是我关于访问基于令牌的问题 API:
调用此 API 的最佳方法是什么?令牌的生命周期为 1 小时。我是否应该 1) 将令牌保存在数据库中,并且对于每个请求,从数据库中提取令牌,检查它是否仍然有效,然后向第三方发出请求 API?或者,2) 每次我需要向 API?
发出请求时请求一个新令牌
使用基于令牌的身份验证有什么好处?由于没有登录的概念,并且请求之间不需要维护状态,使用具有基本身份验证的简单密钥不是更容易吗?
我将从#2 开始:
What is the benefit of using token based authentication? Since there isn't a concept of logging in and no state needs to be maintained between requests, wouldn't it be easier to use a simple secret key with basic auth?
基本身份验证用户名和密码:
- 也是令牌
- 实际上并不'log you in'。它以同样的方式是无状态的,因为用户名和密码会随每个请求一起传递。
所以在这种情况下,您所描述的令牌和密码之间的区别在于令牌的生命周期。听起来您可能实际上有 2 个令牌。一个用于请求(访问令牌),另一个用于请求新的访问令牌(如果它们已过期)(刷新令牌)。
为什么要这样做?一种想法是刷新令牌是最危险的令牌,因为如果访问令牌以某种方式泄漏,它只会在有限的时间内有效。通过将它们分开,您基本上可以减少潜在攻击向量的数量。在一个一切都是安全的世界里,这可能没有什么真正的区别,但我们并不生活在这个世界上。
访问令牌可能会泄漏到日志中,或者通过其他方式意外暴露。刷新令牌暴露的可能性较低。
一些 API 也在一些签名的 json 有效负载 (jwt) 中转换访问令牌,因此他们不需要检查其数据存储的有效性。这些服务可能会在安全更改(新密码、入侵检测)的情况下使刷新令牌过期,但不会使访问令牌过期。
但是,是的,这是一个有点毛茸茸的话题。没有明确的攻击向量可以通过创建两个令牌来阻止,但它是纵深防御。
既然问题 2 已经回答,我将从问题 1 开始
对于基于令牌的身份验证,正如您提到的,对于每个请求,您都可以拦截实际请求并验证令牌,如果令牌有效,您可以允许请求访问您的 api。 最近有一个新标准叫JWT Json 网络令牌。这是关于 JWT 的描述
JSON Web Tokens are an open, industry standard RFC 7519method for representing claims securely between two parties.
JWT.IO允许您解码、验证和生成JWT。
使用 JWT,您可以在每个请求上保存一次数据库调用。客户端应在每次请求时发送此令牌(通常在 http header 中)。在服务器上,拦截获取令牌的请求并根据私钥验证令牌并对用户进行身份验证。可以根据"claims"生成token。例如,声明可以是客户端 ip 地址或用户代理或您认为合理的任何内容。我强烈建议您将 JWT 标准用于 API
的基于令牌的身份验证现在问题2
是的 Http 是无状态协议。特别是当您使用基于 REST 的 APIs 时,它们必须是无状态的并且 session 更少。因此,基本身份验证就足够了。但是,您可能必须调用数据库来验证客户端发送的 base64 编码的用户名和密码。 JWT 令牌的优点是您可以避免这种额外的数据库调用,并且比基本身份验证更安全