使用OAuth2保护整体私有REST API?

时间:2019-02-07 21:23:27

标签: rest oauth-2.0 spring-security-oauth2 rest-security

也许这个问题似乎是基于观点的,但是我在决定确保RESTful API安全时遇到了困难。

首先,我的用例:
我的应用程序非常简单:前端是使用React.js(用于浏览器客户端)编写的,它将使用RESTful API从数据库(或其他东西)获取数据。该API使用Spring framework构建。

此API并不是公共API,它只有一个客户端(到目前为止,以后将是移动应用程序)。

现在让我们来解决安全问题。显然,我想保护我的API,我将Spring-security用作此工作的工具。在学习的最初几天,我只了解基本身份验证。但是,当我继续阅读更安全的选项时,我学到了一些新奇的术语:

  1. 使用JWT的基于令牌的身份验证
  2. OAuth2
  3. OpendId连接

当我阅读来自Auth0Okta等更多博客时,我搞砸了一切。这让我三思而后行,是否应该使用OAuth来保护REST API(这不是公共的)。此外,几乎所有有关OAuth的博客都以社交登录为例。这让我更加困惑,因为OAuth是用于将您的API授予第三方应用程序的访问权限。就是这样,不是我的用例。

然后,我从一些渠道和博客中询问了一些专家,有人说基本身份验证足以确保安全性(使用https),因此我应该避免OAuth这么小的要求。其他人则相反,说Basic-Auth具有安全漏洞。

让我们认为OAuth非常适合我,但是在这种情况下,我的授权服务器会放在哪里?因为教程仅通过将授权代码保留在同一层中来解释授权服务器。没有单独的项目或其他东西。

JWT对我的用户案例也有一些负面评价:

  1. 它们无法撤消,只会自行失效。这不安全吗?
  2. 与会话令牌或cookie相比,它们的体积很大
  3. 用于验证的高计算成本

我真的需要更多建议,这已经花费了我很多时间。

谢谢。

1 个答案:

答案 0 :(得分:1)

真正的答案取决于您问题中所没有的信息。例如,您需要identity verification还是只是authorizing API访问权限?

对于大多数服务(例如Google登录),今天的 OAuth和Open ID Connect(OIDC)基本上是同一件事。 OIDC在授权之上添加了一个身份层。如果您需要验证用户的身份,记录他们的活动,控制每个用户的资源等,这就是您的解决方案。

要授权API端点,有许多解决方案。最常见的是secret key value和JWT。密钥有很多弱点,所以我在这里不再赘述。

授权API端点的一种非常常见的方法是使用JWT令牌和Authorization: Bearer TOKEN HTTP标头。现在,我将尝试回答您对使用JWT令牌的担忧。这里我仅指Signed-JWT令牌。

  

它们无法撤消,只会自行失效。是不是   不安全?

可以通过撤销签名证书来撤销JWT令牌。这将需要创建证书吊销服务器,因此并不常见。一种改进的方法是创建short-lived令牌。典型的到期时间是60分钟(3600秒),但是您可以在任何时间段创建令牌。令牌过期后,客户端会请求一个新令牌,您的后端可以授权或拒绝该令牌。

  

与会话令牌或cookie相比,它们的体积很大

什么是大块?您可以从几个字节(签名加上数据的大小)创建任意大小的令牌,或者在令牌中包含大量信息。除非您的令牌大小不受控制,否则对于大多数实现而言,这都无关紧要。

  

验证的计算成本很高

再次使用模糊的术语。除非您使用的是物联网之类的小型设备(已经在使用SSL证书,加密等),或者您需要每分钟处理数百万笔交易,否则验证签名的JWT不会在计算上造成开销。换句话说,除非您有充分的理由担心CPU周期,否则不必担心它们会提高安全性。

  

让我们认为OAuth非常适合我,但在这种情况下,   我的授权服务器将驻留在哪里?

您的OAuth 2.0授权服务器可以位于您想要的任何位置。实施OAuth非常容易,并且有许多库可以为您管理详细信息。您的授权服务器可以是后端的一部分,也可以是单独的服务器等。您甚至可以将其完全外包给身份提供者,例如Google Login,Auth0,Okta等。