我希望将Django设置为使用OAuth2来验证用户是否正在运行我正在运行的服务,但是我很难理解令牌的传递方式。
我一直在努力完成本教程:https://django-oauth-toolkit.readthedocs.org/en/0.7.0/tutorial/tutorial_01.html。我已经能够将服务器作为OAuth提供商启动并运行,并且它似乎正常运行。我能够登录并设置应用程序。我遇到的困难是弄清楚各种令牌是如何传递的。
假设我的OAuth提供商坐在一台服务器上 - 让我们拨打这个Provider.com - 而我想要通过身份验证的服务是在service.com上。当用户首次尝试向服务发出请求时,他们首先需要对提供者进行身份验证。因此,他们点击登录按钮,将他们引导至Provider.com。他们输入他们的凭据。如果在服务器上正确设置了所有内容,则应向他们显示提示,以便他们有机会允许或拒绝Service.com访问其在Provider.com上的帐户。假设他们单击“允许”,则会将其重定向到Service.com,并获得令牌。在将来调用Service.com时,它们会传入令牌,理论上可以进行经过身份验证的调用。
我理解的问题是:提供者和服务在什么时候沟通?如果呼叫进入服务,它如何知道通过呼叫传入的身份验证令牌是否有效?我们知道它可以知道特定令牌是有效的,除非:A)它识别来自先前调用的同一令牌,该令牌也经过身份验证或B)它与OAuth 2提供者通话并验证令牌的真实性
这里的图表显示了浏览器中的过程:
最后,它让客户端应用程序向OAuth2提供程序发送身份验证代码,客户端ID和客户端密钥。在前面提到的教程中,我们并不清楚这是如何实际完成的。在本教程中,提供程序和服务位于同一台计算机上,看起来它们也共享同一个数据库。
这就引出了我的问题:如何在一个单独的服务器上托管基于Django的OAuth提供程序而不是正在访问的资源/服务?这可能吗?
从另一篇文章中,它表明这可能是不可能的:https://stackoverflow.com/a/26656538/1096385是否确实如此,至少对于现有的Django OAuth2提供程序框架?
答案 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