Skip to content

Commit 19e34bf

Browse files
committed
show TOKEN only on create
return the token as message to the user change MIDDLEWARE_CLASSES (obsolete) to MIDDLEWARE, add required apps, middleware and context processors for admin pages add admin urls to reference project Add admin form for creating AuthTokens, add admin filter for searching AuthTokens Refactor AuthTokenManager, separate methods for token/digest/expiry logic
1 parent 271179a commit 19e34bf

File tree

4 files changed

+64
-6
lines changed

4 files changed

+64
-6
lines changed

knox/admin.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,49 @@
1-
from django.contrib import admin
2-
1+
from django import forms
2+
from django.contrib import admin, messages
3+
from django.contrib.auth import get_user_model
4+
from knox.settings import CONSTANTS
35
from knox import models
46

57

8+
class AuthTokenCreateForm(forms.ModelForm):
9+
10+
def __init__(self, *args, **kwargs):
11+
super(AuthTokenCreateForm, self).__init__(*args, **kwargs)
12+
self.token = None
13+
14+
class Meta:
15+
model = models.AuthToken
16+
fields = ['user', 'expiry']
17+
18+
def save(self, commit=True):
19+
obj = super(AuthTokenCreateForm, self).save(commit=False)
20+
digest, token = models.get_digest_token()
21+
obj.digest = digest
22+
obj.token_key = token[:CONSTANTS.TOKEN_KEY_LENGTH]
23+
self.token = token
24+
if commit:
25+
obj.save()
26+
obj.save_m2m()
27+
return obj
28+
29+
630
@admin.register(models.AuthToken)
731
class AuthTokenAdmin(admin.ModelAdmin):
32+
add_form = AuthTokenCreateForm
833
list_display = ('digest', 'user', 'created', 'expiry',)
34+
# We dont know how a custom User model looks like, but is must have a USERNAME_FIELD
35+
search_fields = ['digest', 'token_key', 'user__'+get_user_model().USERNAME_FIELD]
936
fields = ()
1037
raw_id_fields = ('user',)
38+
39+
def get_form(self, request, obj=None, **kwargs):
40+
defaults = {}
41+
if obj is None:
42+
defaults['form'] = self.add_form
43+
defaults.update(kwargs)
44+
return super(AuthTokenAdmin, self).get_form(request, obj, **defaults)
45+
46+
def save_model(self, request, obj, form, change):
47+
if not change:
48+
self.message_user(request, "TOKEN " + form.token, messages.INFO)
49+
super(AuthTokenAdmin, self).save_model(request, obj, form, change)

knox/models.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,27 @@
1212
User = settings.AUTH_USER_MODEL
1313

1414

15+
def get_expiry(expiry):
16+
if expiry is not None:
17+
expiry = timezone.now() + expiry
18+
return expiry
19+
20+
21+
def get_digest_token(prefix=knox_settings.TOKEN_PREFIX):
22+
token = prefix + crypto.create_token_string()
23+
digest = crypto.hash_token(token)
24+
return digest, token
25+
26+
1527
class AuthTokenManager(models.Manager):
1628
def create(
1729
self,
1830
user,
1931
expiry=knox_settings.TOKEN_TTL,
2032
prefix=knox_settings.TOKEN_PREFIX
2133
):
22-
token = prefix + crypto.create_token_string()
23-
digest = crypto.hash_token(token)
34+
35+
digest, token = get_digest_token(prefix)
2436
if expiry is not None:
2537
expiry = timezone.now() + expiry
2638
instance = super(AuthTokenManager, self).create(

knox_project/settings.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@
55
DEBUG = True
66
ALLOWED_HOSTS = []
77
INSTALLED_APPS = (
8+
'django.contrib.admin',
89
'django.contrib.auth',
910
'django.contrib.contenttypes',
1011
'django.contrib.sessions',
12+
'django.contrib.messages',
13+
'django.contrib.staticfiles',
1114
'rest_framework',
1215
'knox',
1316
)
1417

15-
MIDDLEWARE_CLASSES = (
18+
MIDDLEWARE = (
19+
'django.middleware.security.SecurityMiddleware',
1620
'django.contrib.sessions.middleware.SessionMiddleware',
1721
'django.middleware.common.CommonMiddleware',
1822
'django.middleware.csrf.CsrfViewMiddleware',
1923
'django.contrib.auth.middleware.AuthenticationMiddleware',
20-
'django.middleware.security.SecurityMiddleware',
24+
'django.contrib.messages.middleware.MessageMiddleware',
2125
)
2226

2327
ROOT_URLCONF = 'knox_project.urls'
@@ -32,6 +36,7 @@
3236
'django.template.context_processors.debug',
3337
'django.template.context_processors.request',
3438
'django.contrib.auth.context_processors.auth',
39+
'django.contrib.messages.context_processors.messages',
3540
],
3641
},
3742
},

knox_project/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from django.urls import include, re_path
2+
from django.contrib import admin
23

34
from .views import RootView
45

56
urlpatterns = [
67
re_path(r'^api/', include('knox.urls')),
78
re_path(r'^api/$', RootView.as_view(), name="api-root"),
9+
re_path(r'^admin/', admin.site.urls),
810
]

0 commit comments

Comments
 (0)