在视图中生成OAuth2令牌

时间:2015-02-18 09:48:06

标签: django facebook oauth

假设我有一个AngularJS应用程序,它使用Django应用程序的REST API。

Django应用程序有一个内置的OAuth2提供程序,可以调用它来检索访问令牌并使用API​​的受保护端点。此提供商正在使用django-oauth-toolkit

我们假设有一个注册客户端使用"密码"授予类型,以便最终用户只需要在前端提供他们的凭据,以便从后端获取访问令牌。

在某些时候,我们希望为社交网络登录添加一些支持,我们决定使用python-social-auth(PSA)。这是我想要实现的工作流程:

  1. 用户从前端(通过Facebook SDK)登录Facebook,我们从Facebook的OAuth2提供商处获取访问令牌。
  2. 我们将Facebook令牌发送到REST API的端点。此端点使用Facebook令牌和django-social-auth在我们的Django应用程序中验证用户(基本上将Facebook帐户与应用程序内的标准帐户相匹配)。
  3. 如果身份验证成功,则API端点会向OAuth2提供商请求此新身份验证用户的访问令牌
  4. Django访问令牌被发送回前端,可以用来访问REST API,方式与普通用户(即使用他的凭据登录)完全相同。
  5. 现在我的问题是:如何实现第3步?我首先想到我会使用Client Credentials Grant注册一个单独的OAuth2客户端,但是生成的令牌不是特定于用户的,所以它没有意义。另一种选择是使用DRF的TokenAuthentication,但这会给我的项目增加太多的复杂性。我已经有了OAuth服务器,我不想设置第二个令牌提供程序来规避我的问题,除非这是唯一的解决方案。

    我认为我对PSA和django-oauth-toolkit的理解不足以找到实现目标的最佳方式,但必须有办法。 Help!

1 个答案:

答案 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这将做到这一点(就像它对我做的那样)。