我尝试在我正在开发的项目中使用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."}
好像客户服务没有在正确的位置查找凭据,这让我觉得某些事情没有设置得恰到好处。
答案 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"你必须:
而且,我认为,在此工作流程中,我们不需要auth_backends和中间件,因为我们在REST_FRAMEWORK中有DEFAULT_AUTHENTICATION_CLASSES。
您可以在基于lib的DOT中看到的所有授权类型 https://oauthlib.readthedocs.org/en/latest/oauth2/grants/grants.html
或者您可以使用更简单的"资源所有者基于密码的"如在描述的DOT文件......