Django OAuth 2 客户端设置 - 客户端无法识别令牌
Posted
技术标签:
【中文标题】Django OAuth 2 客户端设置 - 客户端无法识别令牌【英文标题】:Django OAuth 2 client setup - client isn't recognizing tokens 【发布时间】: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."
就好像客户端服务没有在正确的位置寻找凭据,这让我觉得有些东西设置得不太正确。
【问题讨论】:
【参考方案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
对于“隐式授权流程”,您必须:
-
使用用户登录名和密码通过 ModelBackend 登录。
创建 oauth2 应用程序 (/o/applications/)
或从 django 控制台,查看测试。
使用登录用户从“/o/authorize/”url 获取身份验证令牌。
那么您必须将令牌添加到“'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 文档中所述...
【讨论】:
以上是关于Django OAuth 2 客户端设置 - 客户端无法识别令牌的主要内容,如果未能解决你的问题,请参考以下文章
django-oauth2-provider与自定义用户模型?
无法通过 Postman 在 Django oauth 工具包客户端凭据授予中获取访问令牌