【问题标题】:Django OAuth2 provider and resources on different servers?不同服务器上的 Django OAuth2 提供程序和资源?
【发布时间】:2015-03-25 12:45:33
【问题描述】:

我希望将 Django 设置为使用 OAuth2 来为我正在运行的服务对用户进行身份验证,但我在理解令牌如何传递时遇到了一些困难。

我一直在学习本教程:https://django-oauth-toolkit.readthedocs.org/en/0.7.0/tutorial/tutorial_01.html。我已经能够让服务器作为 OAuth 提供程序启动并运行,它似乎可以正常工作。我可以登录它并设置一个应用程序。我遇到的困难是弄清楚各种令牌是如何传递的。

假设我的 OAuth 提供者位于一台服务器上 - 我们称之为 Provider.com - 我想要通过身份验证的服务位于 service.com 上。当用户第一次尝试向服务发出请求时,他们首先需要对 Provider 进行身份验证。所以他们点击了一个登录按钮,将他们引导到 Provider.com。他们输入他们的凭据。如果服务器上的一切设置正确,他们应该会看到一个提示,让他们有机会允许或拒绝 Service.com 访问他们在 Provider.com 上的帐户。假设他们单击“允许”,然后他们将被重定向到 Service.com,并获得一个令牌。在将来调用 Service.com 时,它们会传递令牌,并且理论上能够进行经过身份验证的调用。

我理解的问题是:提供者和服务在什么时候进行通信?如果有调用进入 Service,它如何知道调用传入的身份验证令牌是有效的?有一种方法可以知道特定令牌是有效的,除非:A) 它从先前的调用中识别出相同的令牌,该调用也经过身份验证,或者 B) 它与 OAuth 2 提供者对话并验证令牌的真实性。

类似于此处的图表显示了浏览器中的流程:

最后,客户端应用程序将身份验证代码、客户端 ID 和客户端密码发送到 OAuth2 提供程序。在前面提到的教程中,并不清楚这实际上是如何完成的。在本教程中,提供者和服务在同一台机器上,看起来它们也共享同一个数据库。

这带来了我的问题:如何将基于 Django 的 OAuth 提供程序托管在与正在访问的资源/服务不同的服务器上?这可能吗?

从另一篇文章中,这表明这可能是不可能的:https://stackoverflow.com/a/26656538/1096385 确实如此,至少在现有的 Django OAuth2 提供程序框架中是这样吗?

【问题讨论】:

  • oauth2 真的很容易实现...使用该库对您来说可能比实际情况更难....初始连接客户端登录...您生成中间代码并重定向返回带有 code 参数的 uri。用户提供他们的秘密并回发到您的服务器,此时您向他们发出令牌......然后您从该令牌中查找他们的用户信息(通常设置在标题字段中)

标签: python django oauth-2.0


【解决方案1】:

这取决于您使用的 oauth2 流程。好像你在使用验证码。

在这种情况下:

service.com 将浏览器发送到 provider.com 进行用户身份验证(uri 包含 service.com client_id 和 redirect_uri) 用户在 provider.com 上进行身份验证,然后浏览器使用 ?code 参数重定向到 service.com 的 redirect_uri。 在您的服务器端,处理此代码参数并使用它请求令牌。

https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#web-server-apps

【讨论】:

  • 该链接确实可以澄清事情!实际上,我们最终会将其编写为基于浏览器的应用程序,因为我们同时拥有需要使用该服务的网页和移动应用程序。还有一个问题:是什么阻止了某人在 url 中简单地输入访问令牌? Services.com 如何知道它来自 Provider.com?
  • 我创建了一个相关帖子:stackoverflow.com/questions/28178767/…
猜你喜欢
  • 2013-09-01
  • 2017-01-30
  • 2014-11-17
  • 2011-12-05
  • 2016-05-21
  • 2014-07-09
  • 2018-05-01
  • 2013-08-24
  • 2019-10-27
相关资源
最近更新 更多