假设我有一个AngularJS应用程序,它使用Django应用程序的REST API。
Django应用程序有一个内置的OAuth2提供程序,可以调用它来检索访问令牌并使用API的受保护端点。此提供商正在使用django-oauth-toolkit
。
我们假设有一个注册客户端使用"密码"授予类型,以便最终用户只需要在前端提供他们的凭据,以便从后端获取访问令牌。
在某些时候,我们希望为社交网络登录添加一些支持,我们决定使用python-social-auth
(PSA)。这是我想要实现的工作流程:
django-social-auth
在我们的Django应用程序中验证用户(基本上将Facebook帐户与应用程序内的标准帐户相匹配)。现在我的问题是:如何实现第3步?我首先想到我会使用Client Credentials Grant注册一个单独的OAuth2客户端,但是生成的令牌不是特定于用户的,所以它没有意义。另一种选择是使用DRF的TokenAuthentication
,但这会给我的项目增加太多的复杂性。我已经有了OAuth服务器,我不想设置第二个令牌提供程序来规避我的问题,除非这是唯一的解决方案。
我认为我对PSA和django-oauth-toolkit
的理解不足以找到实现目标的最佳方式,但必须有办法。 Help!
答案 0 :(得分:1)
我设法使用urllib2工作。我无法说明这是否是一种好的做法,但我可以在视图中成功生成OAuth2令牌。
通常情况下,当我使用cURL生成访问令牌时,它看起来像这样:
curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" -u"<client_id>:<client_secret>" http://localhost:8000/o/token/
因此我们的任务是让urllib2实现这一目标。玩了一会儿后,它相当简单。
import urllib, urlib2, base64, json
# Housekeeping
token_url = 'http://localhost:8000/auth/token/'
data = urllib.urlencode({'grant_type':'password', 'username':<username>, 'password':<password>})
authentication = base64.b64encode('%s:%s' % (<client_id>, <client_secret>))
# Down to Business
request = urllib2.Request(token_url, data)
request.add_header("Authorization", "Basic %s" % authentication)
access_credentials = urllib2.urlopen(request)
json_credentials = json.load(access_credentials)
我重申,我不知道这是不是很糟糕,而且我没有考虑这是否会导致Django出现任何问题。 AFAIK这将做到这一点(就像它对我做的那样)。