2013-01-23 135 views
0

我觉得这可能在这里的另一个问题的OAuth来回答,但我无法找到它/登录...用户身份验证使用OAuth

我已经实现Web服务上的我正在写一个OAuth提供商。我的提供程序(“应用程序”)的OAuth使用者具有使用者密钥,并以典型的OAuth方式获取用户访问令牌(获取请求令牌,重定向到我的生产者,让用户授权,获取访问令牌,存储令牌等) 。这一切工作正常。

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

  1. 用户单击登录消费者网站。
  2. 用户被重定向到我的应用程序并呈现登录表单。
  3. 登录后,我的应用程序(OAuth提供程序)意识到此用户已授权此用户,并将其重定向回给用户。
  4. 消费者以某种方式在此请求中告知此用户的用户名(或访问令牌)。

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

执行此操作时需要考虑的一些安全条件是什么?这甚至有可能安全实施?天真地说,这可以通过让生产者返回一些GET参数给消费者回调来实现,用户的用户名(或其他唯一的)。但是,攻击者可以通过向用户的回叫请求用他们想要攻击的用户的用户名来利用这一点。

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

+0

它实际上听起来像你想要实现认证**提供者**服务。它是否正确?所以你想让它返回的结果是“是的,这个用户是犹太人”? –

+0

是的,这基本上是我想要做的 - 让消费者重定向到我的网站,让用户输入他们的详细信息,然后告诉消费者他们很好(以及他们的用户名或其他)。我觉得这更像是一个SSO问题,而不是应该用OAuth来解决的问题,可能呢? –

回答

0

你的问题是,(3):

“登录,我的应用程序(OAuth的提供商)后,意识到这用户 已经认可这笔消费,并重定向他们回到 消费者。”

您的OAuth提供程序无法识别此用户已经过身份验证/授权,因为授权不是由您的应用完成的。 你的应用程序应该决定谁被验证,谁不是,以及他被授权的。这是OAuth的全部想法。

如果你想实现一个OAuth提供者,它“知道”谁被消费者认证,那么消费者必须发送一些东西给你的提供者,并且它在消费者(OAuth客户端)和你的应用OAuth提供商)。

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

+0

感谢您的回复。我有点困惑,为什么我的OAuth提供者无法知道用户以前是否授权过OAuth使用者。在消费者获得用户的永久访问令牌后,访问令牌存储在提供者的数据库中。当用户授权请求令牌时,我的提供者可以查询访问令牌表,并检查此消费者密钥/用户名对是否已有访问令牌。或者我在这里误解了什么? –

+0

“访问令牌存储在提供者的数据库中” - 完全不推荐使用;仔细阅读一下;它会打开许多​​威胁 - 如果您将令牌存储在数据库中,则可能会被盗等等。 – OhadR