Django OAuth 2客户端设置 - 客户端无法识别令牌

时间:2015-01-27 19:49:58

标签: python django oauth-2.0

我尝试在我正在开发的项目中使用Django OAuth Toolkit。我已经设置了两台服务器 - 一台作为OAuth提供商,另一台作为客户端服务,只有经过身份验证的用户才能访问。

OAuth提供商似乎工作正常。我可以在客户端服务上创建指向OAuth提供程序的链接。然后,用户登录,并提示是否允许/拒绝该应用程序。如果用户允许该应用程序,则将用户重定向回客户端服务,并且URI包含访问令牌。因为需要从网站和移动客户端访问此服务,所以我使用隐式授权,并遵循这种做法:https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#browser-based-apps

提供商的所有内容似乎都按预期工作,但我遇到了客户端服务应用程序的问题,该应用程序也是Django应用程序。它似乎无法识别重定向URI中的令牌,因此我无法对服务进行任何经过身份验证的请求。

我对客户服务的settings.py进行了以下更改:

我已添加了AUTHENTICATION_BACKENDS部分,如下所示:

AUTHENTICATION_BACKENDS = (
  'django.contrib.auth.backends.ModelBackend',
  'oauth2_provider.backends.OAuth2Backend', 
)

我已将oauth2_provider.middleware.OAuth2TokenMiddleware添加到MIDDLEWARE_CLASSES部分。

我已将oauth2_provider添加到INSTALLED_APPS。

REST_FRAMEWORK部分现在看起来像:

REST_FRAMEWORK = {
  'DEFAULT_MODEL_SERIALIZER_CLASS':
    'rest_framework.serializers.HyperlinkedModelSerializer',

  'DEFAULT_AUTHENTICATION_CLASSES': (
    'oauth2_provider.ext.rest_framework.OAuth2Authentication',
  ),

  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
  ),
}

我还添加了OAUTH_PROVIDER部分:

OAUTH2_PROVIDER = {
  # this is the list of available scopes 
  'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}
}

尽可能接近,我必须在settings.py中找不到其他东西,这会告诉Django寻找令牌,但我有点失落这可能是什么。

有人能指出我在这里可能缺少的方向吗?

编辑:我应该澄清我在尝试在客户端服务上调用某些内容时得到的结果。当我向客户端服务发出curl请求时(如果插入了实际值):

    curl -H "Authorization: Bearer token_goes_here" https://service.com/api/some_api/call

我得到的结果是:

{"detail": "Authentication credentials were not provided."}

好像客户服务没有在正确的位置查找凭据,这让我觉得某些事情没有设置得恰到好处。

1 个答案:

答案 0 :(得分:1)

DEFAULT_PERMISSION_CLASSES对REST_FRAMEWORK的IsAuthenticated被阻止非身份验证请求。

如果您计划使用javascript访问REST API,请参阅https://github.com/evonove/django-oauth-toolkit/blob/master/oauth2_provider/tests/test_implicit.py

For" Implicit Grant Flow"你必须:

  1. 使用用户登录名和密码通过ModelBackend登录。
  2. 创建oauth2应用程序(/ o / applications /) 或者从django console,参见test。
  3. 从" / o / authorize /&#34获取身份验证令牌;已登录用户的网址。
  4. 然后您必须将令牌添加到"' HTTP_AUTHORIZATION':' Bearer' + access_token,"标题,用于访问API资源。
  5. 而且,我认为,在此工作流程中,我们不需要auth_backends和中间件,因为我们在REST_FRAMEWORK中有DEFAULT_AUTHENTICATION_CLASSES。

    您可以在基于lib的DOT中看到的所有授权类型 https://oauthlib.readthedocs.org/en/latest/oauth2/grants/grants.html

    或者您可以使用更简单的"资源所有者基于密码的"如在描述的DOT文件......