使用 OAuth2 保护单一私有 REST api?
Using OAuth2 for securing a monolith private REST api?
也许这个问题似乎是基于个人意见,但我在决定 获得 RESTful API.
时遇到了困难
首先,我的用例:
我的应用程序非常简单:前端是使用 React.js(对于浏览器客户端)编写的,它将使用 RESTful API 从数据库(或其他东西)获取数据. API 是使用 Spring framework.
构建的
此 API 不是 public API,它只有一个客户端(截至目前,以后将是移动应用程序)。
现在让我们来谈谈安全问题。显然,我想保护我的 API,我正在使用 Spring-security 作为这项工作的工具。刚开始学习的时候,我只知道Basic-Authentication。但是,当我继续阅读更多安全选项时,我学到了一些新奇的术语:
- 基于令牌的身份验证,使用 JWT
- OAuth2
- OpendId 连接
当我阅读更多来自 Auth0, Okta 的博客时,我把一切都搞砸了。这让我三思而后行,是否应该使用 OAuth 来保护 REST API(而不是 public)。此外,几乎所有关于 OAuth 的博客都以社交登录为例。这让我更加困惑,OAuth 是为了让您的 API 访问第三方应用程序。就是这样,不适用于我的用例。
然后我从一些渠道和博客上询问了一些专家,一些人说基本身份验证已经足够安全(使用 https),我应该避免 OAuth 这么小的要求。其他人则相反,说 Basic-Auth 存在安全漏洞。
让我们考虑一下 OAuth 对我来说是完美的,但在那种情况下,我的 授权服务器 在哪里?因为教程仅通过将代码保持在同一层来解释授权服务器。没有单独的项目什么的。
智威汤逊对我的用户案例也有一些负面评论:
- 它们无法撤销,只会自行过期。是不是没有安全感?
- 与会话令牌或 cookie 相比,它们的规模很大
- 验证的高计算成本
我真的需要更多关于这方面的建议,这已经花了我很多周的时间。
谢谢。
真正的答案取决于您问题中没有的信息。例如,您需要 identity verification
还是只是 authorizing
API 访问权限?
今天的 OAuth 和 Open ID Connect (OIDC) 对于 Google 登录等大多数服务来说基本上是一样的。 OIDC 在授权之上添加了一个身份层。如果您需要验证用户的身份,记录他们的 activity,控制每个用户的资源等。这就是您的解决方案。
授权API端点,有很多解决方案。最常见的是 secret key value
和 JWT。秘钥有很多弱点,这里就不多说了。
授权 API 端点的一种非常常见的方法是使用 JWT 令牌和 Authorization: Bearer TOKEN
HTTP header。我现在将尝试回答您对使用 JWT 令牌的担忧。这里我只参考Signed-JWT个代币。
they cannot be revoked, will only expire on its own. Isn't it
insecure?
可以通过撤销签名证书来撤销 JWT 令牌。这需要创建一个证书撤销服务器,所以这并不常见。一种改进的方法是创建 short-lived
个令牌。典型的到期时间为 60 分钟(3600 秒),但您可以为任何时间段创建令牌。当令牌过期时,客户端请求一个新的,您的后端可以授权或拒绝。
they are massive in size, compared to session token or cookie
什么是质量?您可以从几个字节(签名加上数据的大小)创建任何大小的令牌,或在令牌中包含大量信息。除非您的令牌大小失控,否则这对大多数实现都无关紧要。
high computational cost for verification
你又用了一个模糊的术语。验证签名 JWT 的计算成本并不高,除非您使用的是小型设备,例如 IoT(已经在使用 SSL 证书、加密等),或者您需要每分钟处理数百万笔交易。换句话说,除非您有充分的理由担心 CPU 周期,否则在提高安全性方面不要担心它们。
Let's consider that OAuth is perfect for me, but in that case also,
where would my Authorization server reside?
您的 OAuth 2.0 授权服务器可以位于您想要的任何位置。实施 OAuth 非常容易,有许多库可以为您管理细节。您的授权服务器可以是后端的一部分,可以是单独的服务器等。您甚至可以将其完全外包给身份提供商,例如 Google Login、Auth0、Okta 等
也许这个问题似乎是基于个人意见,但我在决定 获得 RESTful API.
时遇到了困难首先,我的用例:
我的应用程序非常简单:前端是使用 React.js(对于浏览器客户端)编写的,它将使用 RESTful API 从数据库(或其他东西)获取数据. API 是使用 Spring framework.
此 API 不是 public API,它只有一个客户端(截至目前,以后将是移动应用程序)。
现在让我们来谈谈安全问题。显然,我想保护我的 API,我正在使用 Spring-security 作为这项工作的工具。刚开始学习的时候,我只知道Basic-Authentication。但是,当我继续阅读更多安全选项时,我学到了一些新奇的术语:
- 基于令牌的身份验证,使用 JWT
- OAuth2
- OpendId 连接
当我阅读更多来自 Auth0, Okta 的博客时,我把一切都搞砸了。这让我三思而后行,是否应该使用 OAuth 来保护 REST API(而不是 public)。此外,几乎所有关于 OAuth 的博客都以社交登录为例。这让我更加困惑,OAuth 是为了让您的 API 访问第三方应用程序。就是这样,不适用于我的用例。
然后我从一些渠道和博客上询问了一些专家,一些人说基本身份验证已经足够安全(使用 https),我应该避免 OAuth 这么小的要求。其他人则相反,说 Basic-Auth 存在安全漏洞。
让我们考虑一下 OAuth 对我来说是完美的,但在那种情况下,我的 授权服务器 在哪里?因为教程仅通过将代码保持在同一层来解释授权服务器。没有单独的项目什么的。
智威汤逊对我的用户案例也有一些负面评论:
- 它们无法撤销,只会自行过期。是不是没有安全感?
- 与会话令牌或 cookie 相比,它们的规模很大
- 验证的高计算成本
我真的需要更多关于这方面的建议,这已经花了我很多周的时间。
谢谢。
真正的答案取决于您问题中没有的信息。例如,您需要 identity verification
还是只是 authorizing
API 访问权限?
今天的 OAuth 和 Open ID Connect (OIDC) 对于 Google 登录等大多数服务来说基本上是一样的。 OIDC 在授权之上添加了一个身份层。如果您需要验证用户的身份,记录他们的 activity,控制每个用户的资源等。这就是您的解决方案。
授权API端点,有很多解决方案。最常见的是 secret key value
和 JWT。秘钥有很多弱点,这里就不多说了。
授权 API 端点的一种非常常见的方法是使用 JWT 令牌和 Authorization: Bearer TOKEN
HTTP header。我现在将尝试回答您对使用 JWT 令牌的担忧。这里我只参考Signed-JWT个代币。
they cannot be revoked, will only expire on its own. Isn't it insecure?
可以通过撤销签名证书来撤销 JWT 令牌。这需要创建一个证书撤销服务器,所以这并不常见。一种改进的方法是创建 short-lived
个令牌。典型的到期时间为 60 分钟(3600 秒),但您可以为任何时间段创建令牌。当令牌过期时,客户端请求一个新的,您的后端可以授权或拒绝。
they are massive in size, compared to session token or cookie
什么是质量?您可以从几个字节(签名加上数据的大小)创建任何大小的令牌,或在令牌中包含大量信息。除非您的令牌大小失控,否则这对大多数实现都无关紧要。
high computational cost for verification
你又用了一个模糊的术语。验证签名 JWT 的计算成本并不高,除非您使用的是小型设备,例如 IoT(已经在使用 SSL 证书、加密等),或者您需要每分钟处理数百万笔交易。换句话说,除非您有充分的理由担心 CPU 周期,否则在提高安全性方面不要担心它们。
Let's consider that OAuth is perfect for me, but in that case also, where would my Authorization server reside?
您的 OAuth 2.0 授权服务器可以位于您想要的任何位置。实施 OAuth 非常容易,有许多库可以为您管理细节。您的授权服务器可以是后端的一部分,可以是单独的服务器等。您甚至可以将其完全外包给身份提供商,例如 Google Login、Auth0、Okta 等