用于 REST Web 服务的 OAuth 2.0

Posted

技术标签:

【中文标题】用于 REST Web 服务的 OAuth 2.0【英文标题】:OAuth 2.0 for REST Web services 【发布时间】:2017-01-07 04:37:52 【问题描述】:

我正在为现有应用程序实现 REST 层。我的用户名和密码存储在数据库中,我想在调用我的 REST 服务时验证这些凭据。请注意,这是一个独立的应用程序。

经过调查,我想出了两种方法。

使用 HTTPS 的基本实现 - 这种方法可确保 传递的用户名和密码不会被中间人攻击篡改。 使用身份验证令牌 (JWT) - 用户最初传递他的用户 ID 和密码和服务器返回一个身份验证令牌。一旦用户 具有可用于后续的身份验证令牌 请求。 使用 OAuth 2.0 - 我对这种方法很困惑。阅读文档和规范后,我发现自从我的应用程序 是独立的,我需要实现授权服务器,资源 服务器等

我被要求在这里实现 OAuth,但我不相信在这种情况下需要 OAuth。我更倾向于只实现 JWT(tokens)

在这种情况下是否真的需要 OAuth。我对 OAuth 的理解是当您已经拥有 Facebook/Google 等服务时使用它。

有人可以确认我的思路是否正确以及在这种情况下是否需要 OAuth 2.0?

【问题讨论】:

OAuth 2.0 和 JWT 可以一起使用(访问令牌可以是 JWT)。不确定这是否是混乱所在,但如果您只需要担心一种资源,听起来 JWT 可以工作吗? 或者,您是否有可能被要求实现“使用 Google 登录”之类的功能? @neverendingqs 该产品是独立的企业产品,执行一些“xyz”任务,我正在为这些任务公开 REST api。我不可能有像“用 facebook 或 google 登录”这样的东西。我知道 Oauth2 和 JWT 可以一起使用,但我的主要困惑是 OAuth 2.0 是否适合这种场景?我可以使用 Oauth2 验证存储在数据库中的用户名和密码吗?我将如何实现资源服务器、授权服务器? 您是否考虑过资源所有者密码凭证授予 (tools.ietf.org/html/rfc6749#section-4.3)?这是另一种选择。 可能“资源所有者密码凭据授予”似乎接近我的规范。您知道任何实现此功能的 java OAuth 库吗?在我的情况下,我需要实现我的授权服务器? 【参考方案1】:

OAuth 2.0 的主要目标是允许用户通过第三方身份验证提供商(例如 Google、Facebook 等)进行身份验证以使用客户端应用程序,而不会将其凭据(通常是用户名/密码)暴露给客户。

在您的情况下,如果用户只打算使用他们在您的数据库中的凭据对您的系统进行身份验证,那么实施 OAuth 2.0 不会为您增加任何实质性价值。

OAuth 2.0 规范确实定义了一个 "Resource Owner Password Credentials grant",用于旧用例,适用于您的情况:用户发送凭据,您返回访问令牌(如果您愿意,可以是 JWT)。如果从管理或营销的角度来看是可取的,您可以实施资源所有者密码凭据授权并合法地声明您的应用程序“符合 RFC6749 定义的 OAuth2 的子集”。

【讨论】:

以上是关于用于 REST Web 服务的 OAuth 2.0的主要内容,如果未能解决你的问题,请参考以下文章

将 OAuth 2.0 用于 Web 服务器应用程序流时无法选择正确的通道

使用 oAuth 2.0 保护基于 Jersey 的 REST 服务

春天。 REST API 的实现 Oauth.2.0

用于微服务架构的OAuth 2.0流程

text REST令牌请求(OAuth 2.0)

使用 Spring oauth2 使用 OAuth 保护的 REST Web 服务