Skip to content

Commit 6a8b1fa

Browse files
committed
Implemented configurable AccessToken and RefreshToken
1 parent 78efc3a commit 6a8b1fa

12 files changed

+88
-14
lines changed

oauth2_provider/admin.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from django.contrib import admin
22

3-
from .models import Grant, AccessToken, RefreshToken, get_application_model
3+
from .models import Grant, get_access_token_model, get_refresh_token_model, get_application_model
44

55

66
class RawIDAdmin(admin.ModelAdmin):
77
raw_id_fields = ('user',)
88

99
Application = get_application_model()
10+
AccessToken = get_access_token_model()
11+
RefreshToken = get_refresh_token_model()
1012

1113
admin.site.register(Application, RawIDAdmin)
1214
admin.site.register(Grant, RawIDAdmin)

oauth2_provider/models.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def __str__(self):
165165

166166

167167
@python_2_unicode_compatible
168-
class AccessToken(models.Model):
168+
class AbstractAccessToken(models.Model):
169169
"""
170170
An AccessToken instance represents the actual access token to
171171
access user's resources, as in :rfc:`5`.
@@ -217,8 +217,15 @@ def __str__(self):
217217
return self.token
218218

219219

220+
class AccessToken(AbstractAccessToken):
221+
pass
222+
223+
# Add swappable like this to not break django 1.4 compatibility
224+
AccessToken._meta.swappable = 'OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL'
225+
226+
220227
@python_2_unicode_compatible
221-
class RefreshToken(models.Model):
228+
class AbstractRefreshToken(models.Model):
222229
"""
223230
A RefreshToken instance represents a token that can be swapped for a new
224231
access token when it expires.
@@ -234,13 +241,20 @@ class RefreshToken(models.Model):
234241
user = models.ForeignKey(AUTH_USER_MODEL)
235242
token = models.CharField(max_length=255, db_index=True)
236243
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL)
237-
access_token = models.OneToOneField(AccessToken,
244+
access_token = models.OneToOneField(oauth2_settings.ACCESS_TOKEN_MODEL,
238245
related_name='refresh_token')
239246

240247
def __str__(self):
241248
return self.token
242249

243250

251+
class RefreshToken(AbstractRefreshToken):
252+
pass
253+
254+
# Add swappable like this to not break django 1.4 compatibility
255+
RefreshToken._meta.swappable = 'OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL'
256+
257+
244258
def get_application_model():
245259
""" Return the Application model that is active in this project. """
246260
try:
@@ -253,3 +267,31 @@ def get_application_model():
253267
e = "APPLICATION_MODEL refers to model {0} that has not been installed"
254268
raise ImproperlyConfigured(e.format(oauth2_settings.APPLICATION_MODEL))
255269
return app_model
270+
271+
272+
def get_access_token_model():
273+
""" Return the AccessToken model that is active in this project. """
274+
try:
275+
app_label, model_name = oauth2_settings.ACCESS_TOKEN_MODEL.split('.')
276+
except ValueError:
277+
e = "ACCESS_TOKEN_MODEL must be of the form 'app_label.model_name'"
278+
raise ImproperlyConfigured(e)
279+
access_token_model = get_model(app_label, model_name)
280+
if access_token_model is None:
281+
e = "ACCESS_TOKEN_MODEL refers to model {0} that has not been installed"
282+
raise ImproperlyConfigured(e.format(oauth2_settings.ACCESS_TOKEN_MODEL))
283+
return access_token_model
284+
285+
286+
def get_refresh_token_model():
287+
""" Return the RefreshToken model that is active in this project. """
288+
try:
289+
app_label, model_name = oauth2_settings.REFRESH_TOKEN_MODEL.split('.')
290+
except ValueError:
291+
e = "REFRESH_TOKEN_MODEL must be of the form 'app_label.model_name'"
292+
raise ImproperlyConfigured(e)
293+
refresh_token_model = get_model(app_label, model_name)
294+
if refresh_token_model is None:
295+
e = "REFRESH_TOKEN_MODEL refers to model {0} that has not been installed"
296+
raise ImproperlyConfigured(e.format(oauth2_settings.REFRESH_TOKEN_MODEL))
297+
return refresh_token_model

oauth2_provider/oauth2_validators.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from oauthlib.oauth2 import RequestValidator
1212

1313
from .compat import unquote_plus
14-
from .models import Grant, AccessToken, RefreshToken, get_application_model, AbstractApplication
14+
from .models import Grant, get_access_token_model, get_refresh_token_model, get_application_model, AbstractApplication
1515
from .settings import oauth2_settings
1616

1717
log = logging.getLogger('oauth2_provider')
@@ -212,6 +212,9 @@ def validate_bearer_token(self, token, scopes, request):
212212
if not token:
213213
return False
214214

215+
# Load the AccessToken model
216+
AccessToken = get_access_token_model()
217+
215218
try:
216219
access_token = AccessToken.objects.select_related("application", "user").get(
217220
token=token)
@@ -283,6 +286,13 @@ def save_bearer_token(self, token, request, *args, **kwargs):
283286
Save access and refresh token, If refresh token is issued, remove old refresh tokens as
284287
in rfc:`6`
285288
"""
289+
290+
# Load the AccessToken model
291+
AccessToken = get_access_token_model()
292+
293+
# Load the RefreshToken model
294+
RefreshToken = get_refresh_token_model()
295+
286296
if request.refresh_token:
287297
# remove used refresh token
288298
try:
@@ -325,6 +335,12 @@ def revoke_token(self, token, token_type_hint, request, *args, **kwargs):
325335
if token_type_hint not in ['access_token', 'refresh_token']:
326336
token_type_hint = None
327337

338+
# Load the AccessToken model
339+
AccessToken = get_access_token_model()
340+
341+
# Load the RefreshToken model
342+
RefreshToken = get_refresh_token_model()
343+
328344
token_types = {
329345
'access_token': AccessToken,
330346
'refresh_token': RefreshToken,
@@ -358,6 +374,9 @@ def validate_refresh_token(self, refresh_token, client, request, *args, **kwargs
358374
Check refresh_token exists and refers to the right client.
359375
Also attach User instance to the request object
360376
"""
377+
# Load the RefreshToken model
378+
RefreshToken = get_refresh_token_model()
379+
361380
try:
362381
rt = RefreshToken.objects.get(token=refresh_token)
363382
request.user = rt.user

oauth2_provider/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
'AUTHORIZATION_CODE_EXPIRE_SECONDS': 60,
4242
'ACCESS_TOKEN_EXPIRE_SECONDS': 36000,
4343
'APPLICATION_MODEL': getattr(settings, 'OAUTH2_PROVIDER_APPLICATION_MODEL', 'oauth2_provider.Application'),
44+
'ACCESS_TOKEN_MODEL': getattr(settings, 'OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL', 'oauth2_provider.AccessToken'),
45+
'REFRESH_TOKEN_MODEL': getattr(settings, 'OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL', 'oauth2_provider.RefreshToken'),
4446
'REQUEST_APPROVAL_PROMPT': 'force',
4547
'ALLOWED_REDIRECT_URI_SCHEMES': ['http', 'https'],
4648

oauth2_provider/tests/test_auth_backends.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
from ..compat import get_user_model
99
from ..models import get_application_model
10-
from ..models import AccessToken
10+
from ..models import get_access_token_model
1111
from ..backends import OAuth2Backend
1212
from ..middleware import OAuth2TokenMiddleware
1313

1414
UserModel = get_user_model()
1515
ApplicationModel = get_application_model()
16-
16+
AccessToken = get_access_token_model()
1717

1818
class BaseTest(TestCase):
1919
"""

oauth2_provider/tests/test_authorization_code.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
from django.utils import timezone
1111

1212
from ..compat import urlparse, parse_qs, urlencode, get_user_model
13-
from ..models import get_application_model, Grant, AccessToken
13+
from ..models import get_application_model, Grant, get_access_token_model
1414
from ..settings import oauth2_settings
1515
from ..views import ProtectedResourceView
1616

1717
from .test_utils import TestCaseUtils
1818

1919

2020
Application = get_application_model()
21+
AccessToken = get_access_token_model()
2122
UserModel = get_user_model()
2223

2324

oauth2_provider/tests/test_client_credential.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from oauthlib.oauth2 import BackendApplicationServer
1515

16-
from ..models import get_application_model, AccessToken
16+
from ..models import get_application_model, get_access_token_model
1717
from ..oauth2_backends import OAuthLibCore
1818
from ..oauth2_validators import OAuth2Validator
1919
from ..settings import oauth2_settings
@@ -24,6 +24,7 @@
2424

2525

2626
Application = get_application_model()
27+
AccessToken = get_access_token_model()
2728
UserModel = get_user_model()
2829

2930

oauth2_provider/tests/test_decorators.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66

77
from ..decorators import protected_resource, rw_protected_resource
88
from ..settings import oauth2_settings
9-
from ..models import get_application_model, AccessToken
9+
from ..models import get_application_model, get_access_token_model
1010
from ..compat import get_user_model
1111
from .test_utils import TestCaseUtils
1212

1313

1414
Application = get_application_model()
15+
AccessToken = get_access_token_model()
1516
UserModel = get_user_model()
1617

1718

oauth2_provider/tests/test_models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
from django.core.exceptions import ValidationError
1212
from django.utils import timezone
1313

14-
from ..models import get_application_model, Grant, AccessToken, RefreshToken
14+
from ..models import get_application_model, Grant, get_access_token_model, get_refresh_token_model
1515
from ..compat import get_user_model
1616

1717

1818
Application = get_application_model()
19+
AccessToken = get_access_token_model()
20+
RefreshToken = get_refresh_token_model()
1921
UserModel = get_user_model()
2022

2123

oauth2_provider/tests/test_rest_framework.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88

99
from .test_utils import TestCaseUtils
10-
from ..models import AccessToken, get_application_model
10+
from ..models import get_access_token_model, get_application_model
1111
from ..settings import oauth2_settings
1212
from ..compat import get_user_model
1313

1414

1515
Application = get_application_model()
16+
AccessToken = get_access_token_model()
1617
UserModel = get_user_model()
1718

1819

0 commit comments

Comments
 (0)