0

我觉得这可能会在这里的另一个 OAuth 问题中得到回答,但我找不到它......

我已经在我正在编写的 Web 服务上实现了 OAuth 提供程序。我的提供者(“应用程序”)的 OAuth 消费者拥有消费者密钥,并以典型的 OAuth 方式获取用户访问令牌(获取请求令牌、重定向到我的生产者以让用户授权、获取访问令牌、存储它等) . 这一切都很好。

我的问题是关于这些 OAuth 消费者如何在使用的应用程序的登录凭据访问他们时对某人进行身份验证。基本上,当有人访问消费者应用程序时,我想:

  1. 用户在消费者网站上点击登录。
  2. 用户被重定向到我的应用程序并显示了一个登录表单。
  3. 登录后,我的应用程序(OAuth 提供者)意识到这个用户已经授权了这个消费者,并将他们重定向回消费者。
  4. 在此请求中,消费者以某种方式被告知该用户的用户名(或访问令牌)。

这类似于典型的 OAuth 流程,不同之处在于 OAuth 使用者不需要将授权的请求令牌交换为访问令牌。相反,一旦用户通过身份验证,消费者现在就知道哪个用户通过了身份验证,并且可以立即开始使用他们已经存储的存储令牌/秘密发出请求。

实施时我需要考虑哪些安全条件?这甚至可以安全地实施吗?天真地,这可以通过让生产者向消费者回调返回一些 GET 参数以及用户的用户名(或其他独特的东西)来实现。但是,攻击者可以通过使用他们想要攻击的用户的用户名向消费者的回调发出请求来利用这一点。

想法?这是我试图重新发明和重新实施的已解决问题吗?我的平台是 Java,如果有库已经完成了所有这些。谢谢!

4

1 回答 1

0

你的问题是(3):

“登录后,我的应用程序(OAuth 提供者)意识到这个用户已经授权了这个消费者,并将他们重定向回消费者。”

您的 OAuth 提供者无法意识到此用户已经过身份验证/授权,因为您的应用程序未完成授权。您的应用程序应该决定谁通过身份验证,谁不通过身份验证,以及他被授权做什么。这就是 OAuth 的全部理念。

如果你想实现一个 OAuth 提供者,它“知道”谁通过了消费者的身份验证,那么消费者必须向你的提供者发送一些东西,它会在消费者(OAuth 客户端)和你的应用程序(OAuth 提供者)之间建立耦合。

OAuth SPEC准确定义了OAuth 的通用接口,所以如果你想坚持它,你应该避免向提供者发送额外的数据,这样它就不会耦合到特定的客户端。

于 2013-01-23T07:58:47.973 回答