【发布时间】: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."}
就好像客户端服务没有在正确的位置寻找凭据,这让我觉得有些东西设置得不太正确。
【问题讨论】: