【问题标题】:Django OAuth 2 client setup - client isn't recognizing tokensDjango OAuth 2 客户端设置 - 客户端无法识别令牌
【发布时间】:2015-03-26 13:22:00
【问题描述】:

我尝试在我正在处理的项目中使用 Django OAuth 工具包。我设置了两台服务器——一台作为 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."}

就好像客户端服务没有在正确的位置寻找凭据,这让我觉得有些东西设置得不太正确。

【问题讨论】:

    标签: python django oauth-2.0


    【解决方案1】:

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

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

    对于“隐式授权流程”,您必须:

    1. 使用用户登录名和密码通过 ModelBackend 登录。
    2. 创建 oauth2 应用程序 (/o/applications/) 或从 django 控制台,查看测试。
    3. 使用登录用户从“/o/authorize/”url 获取身份验证令牌。
    4. 那么您必须将令牌添加到“'HTTP_AUTHORIZATION': 'Bearer' + access_token” 标头,才能访问 API 资源。

    而且,我认为,在这个工作流程中,我们不需要 auth_backends 和中间件,因为我们在 REST_FRAMEWORK 中有 DEFAULT_AUTHENTICATION_CLASSES。

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

    或者您可以使用更简单的“基于资源所有者密码”,如 DOT 文档中所述...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-08
      • 2018-05-25
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2017-04-28
      相关资源
      最近更新 更多