Django/tastypie 实现中的 OAuth 2.0 客户端 ID

Posted

技术标签:

【中文标题】Django/tastypie 实现中的 OAuth 2.0 客户端 ID【英文标题】:OAuth 2.0 client ids in Django/tastypie implementation 【发布时间】:2013-12-31 10:07:58 【问题描述】:

我正在尝试为我的 API 实施 OAuth 2.0。我正在使用第三方库作为基本的 OAuth 提供程序 django-oauth2-provider, 和 Tastypie 作为框架。这些细节不应该太重要。 OAuth 2.0 有效——创建用户时,OAuth 2 客户端 管理用户的 secret_key 并创建他们的 id。然后,客户可以提供他们从用户创建中获得的用户 ID 端点连同他们的用户名和密码来获得一个访问令牌,允许他们使用 API 端点。·

我遇到问题的地方是检索客户端 ID(必须将其传递到访问令牌的请求中)。显然当一个用户第一次被创建时 我可以用 HTTP 响应返回 client_id。然而,在那之后,显然会有用户没有他们的客户ID的情况· 存储在本地(这是传统的用户/应用程序设置,而不是像 Google API 那样您的客户端 ID 始终可见)。我要保护 使用 OAuth 获取对客户资源的请求,但这意味着我无法查询 API 以获取给定用户的客户端 ID。这似乎是重点 如果我总是可以只传递用户名和密码以从某个 oauth 端点检索我的客户端 ID,那么 OAuth 就会失败。我是不是想错了?

此外,通过阅读 OAuth 规范,我的印象是,客户端 ID 和客户端密码都是为了获得访问令牌而应该提供的。然而,我使用的实现默认强制用户提供客户端 ID、客户端密码、用户名和密码。我已经重写了实现,只需要客户端 ID 和密码,但我想确保这是正确的调用并且我没有遗漏任何东西。

编辑flup的响应:

我正在处理一个 Django API 作为资源服务器,一个 iPhone 应用程序的用户作为资源所有者。 iPhone 应用程序直接与服务器相关联——换句话说,这里没有第三方参与,也没有计划在未来让他们参与;所有软件都是我们的。我认为密码流将是我在这种情况下所需要的。事实上,这似乎是 django-oauth2-provider 默认提供的。我想与他们正在做的事情保持一致,而不必完全重新发明***。

【问题讨论】:

您写道,“创建了一个管理用户的 secret_key 和他们的 id 的 OAuth 2 客户端”。使用 OAuth 2,不再有客户端机密。您要使用哪个版本的 OAuth?在最后一段中,您还写了“通过阅读 OAuth 规范,我的印象是客户端 ID 和客户端密码......”,但在 OAuth 2 中,没有客户端密码(我知道,我自己重复一遍)。我有点困惑,你想要什么。 @F***Parzefall oauth2 授权授权流程确实使用了客户端密码,隐式流程不使用 【参考方案1】:

oauth2 的目标是让资源所有者给客户端一个代客密钥,该密钥授权它代表他访问您服务器上的某些资源。

如果不涉及第三方,则无需客户端授权,无需使用oauth2。

相反,您可以使用standard authentication mechanisms present in tastypie。

【讨论】:

我已经写下了一些基础知识,您能否更新一下您的问题,说明客户是什么以及您希望实施哪些流程? 您写道,每个用户只有一个客户端是一种误解。但是,如果您查看 django-oauth2-provider 代码,每个客户端(与访问密钥相关联)都属于一个用户:github.com/caffeinehit/django-oauth2-provider/blob/master/…(查看 Client 类)。 客户端是应用程序,而不是用户。库的 Client 类中有点希望的部分是 the user fk got made optional。但对我来说它看起来有点乱。 更重要的是,不过,如果没有第三方,根本就不需要使用oauth2。 假设将来有可能将 OAuth2 用于第三方,但现在我们专注于简单地验证我们自己的用户。有没有办法在没有第三方应用程序的情况下保留现有的 OAuth 方案或类似方案?除了更复杂的流程之外,还有什么真正的缺点吗?当不涉及第三方并且保护数据至关重要时,OAuth 最安全的替代方案是什么?基于 SSL 的基本身份验证?

以上是关于Django/tastypie 实现中的 OAuth 2.0 客户端 ID的主要内容,如果未能解决你的问题,请参考以下文章

Django/Tastypie - DELETE 请求删除所有内容

Django RESTful API - django-piston 与 django-tastypie

如何通知应用程序凭据在 Django/Tastypie/REST 中成功

python Django Tastypie Geojson Serializer

Django Tastypie:带有“空格”的反向 url。如何?

Django Tastypie 总是返回 401 未经授权