mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-24 00:04:16 +03:00
client credentials should be optional (fix #759)
client credentials should only be required on token request Signed-off-by: Fernando Rocha <fernandogrd@gmail.com>
This commit is contained in:
parent
9b56616750
commit
f1b8fee4f1
|
@ -2,14 +2,16 @@
|
||||||
Provides a set of pluggable authentication policies.
|
Provides a set of pluggable authentication policies.
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import base64
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from django.contrib.auth import authenticate
|
from django.contrib.auth import authenticate
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from rest_framework import exceptions, HTTP_HEADER_ENCODING
|
from rest_framework import exceptions, HTTP_HEADER_ENCODING
|
||||||
from rest_framework.compat import CsrfViewMiddleware
|
from rest_framework.compat import CsrfViewMiddleware
|
||||||
from rest_framework.compat import oauth, oauth_provider, oauth_provider_store
|
from rest_framework.compat import oauth, oauth_provider, oauth_provider_store
|
||||||
from rest_framework.compat import oauth2_provider, oauth2_provider_forms, oauth2_provider_backends
|
from rest_framework.compat import oauth2_provider, oauth2_provider_forms
|
||||||
from rest_framework.authtoken.models import Token
|
from rest_framework.authtoken.models import Token
|
||||||
import base64
|
|
||||||
|
|
||||||
|
|
||||||
def get_authorization_header(request):
|
def get_authorization_header(request):
|
||||||
|
@ -314,22 +316,24 @@ class OAuth2Authentication(BaseAuthentication):
|
||||||
"""
|
"""
|
||||||
Authenticate the request, given the access token.
|
Authenticate the request, given the access token.
|
||||||
"""
|
"""
|
||||||
|
client = None
|
||||||
|
|
||||||
# Authenticate the client
|
# Authenticate the client
|
||||||
|
if 'client_id' in request.REQUEST:
|
||||||
oauth2_client_form = oauth2_provider_forms.ClientAuthForm(request.REQUEST)
|
oauth2_client_form = oauth2_provider_forms.ClientAuthForm(request.REQUEST)
|
||||||
if not oauth2_client_form.is_valid():
|
if not oauth2_client_form.is_valid():
|
||||||
raise exceptions.AuthenticationFailed('Client could not be validated')
|
raise exceptions.AuthenticationFailed('Client could not be validated')
|
||||||
client = oauth2_client_form.cleaned_data.get('client')
|
client = oauth2_client_form.cleaned_data.get('client')
|
||||||
|
|
||||||
# Retrieve the `OAuth2AccessToken` instance from the access_token
|
try:
|
||||||
auth_backend = oauth2_provider_backends.AccessTokenBackend()
|
token = oauth2_provider.models.AccessToken.objects.select_related('user')
|
||||||
token = auth_backend.authenticate(access_token, client)
|
if client is not None:
|
||||||
if token is None:
|
token = token.filter(client=client)
|
||||||
|
token = token.get(token=access_token, expires__gt=datetime.now())
|
||||||
|
except oauth2_provider.models.AccessToken.DoesNotExist:
|
||||||
raise exceptions.AuthenticationFailed('Invalid token')
|
raise exceptions.AuthenticationFailed('Invalid token')
|
||||||
|
|
||||||
user = token.user
|
if not token.user.is_active:
|
||||||
|
|
||||||
if not user.is_active:
|
|
||||||
msg = 'User inactive or deleted: %s' % user.username
|
msg = 'User inactive or deleted: %s' % user.username
|
||||||
raise exceptions.AuthenticationFailed(msg)
|
raise exceptions.AuthenticationFailed(msg)
|
||||||
|
|
||||||
|
|
|
@ -516,6 +516,18 @@ class OAuth2Tests(TestCase):
|
||||||
response = self.csrf_client.get('/oauth2-test/', params, HTTP_AUTHORIZATION=auth)
|
response = self.csrf_client.get('/oauth2-test/', params, HTTP_AUTHORIZATION=auth)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
@unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
|
||||||
|
def test_get_form_passing_auth_without_client_params(self):
|
||||||
|
"""
|
||||||
|
Ensure GETing form over OAuth without client credentials
|
||||||
|
|
||||||
|
Regression test for issue #759:
|
||||||
|
https://github.com/tomchristie/django-rest-framework/issues/759
|
||||||
|
"""
|
||||||
|
auth = self._create_authorization_header()
|
||||||
|
response = self.csrf_client.get('/oauth2-test/', HTTP_AUTHORIZATION=auth)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
@unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
|
@unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')
|
||||||
def test_post_form_passing_auth(self):
|
def test_post_form_passing_auth(self):
|
||||||
"""Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF"""
|
"""Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user