【发布时间】: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。用户提供他们的秘密并回发到您的服务器,此时您向他们发出令牌......然后您从该令牌中查找他们的用户信息(通常设置在标题字段中)