From f000e564f9e22bf013ab45f3e3dcb7dfae612357 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 4 Sep 2019 21:08:57 -0500 Subject: [PATCH] Misc updates --- CHANGELOG | 10 ++ docs/example_dropin.png | Bin 0 -> 68169 bytes readme.md | 139 +++++++++++++++++- sqrl/static/sqrl/sqrl.js | 11 ++ .../admin/auth/user/sqrl_manage.html | 10 +- sqrl/templates/admin/login.html | 12 +- sqrl/templates/sqrl/login.html | 4 +- sqrl/templates/sqrl/manage.html | 4 +- sqrl/templates/sqrl/sqrl-dropin.html | 10 +- sqrl/templatetags/sqrl.py | 10 +- 10 files changed, 183 insertions(+), 27 deletions(-) create mode 100644 docs/example_dropin.png diff --git a/CHANGELOG b/CHANGELOG index bf12dbc..ea5a6c5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +Wed, 04 Sep 2019 21:08:57 -0500 +Keaton +Misc updates + +- Fleshed out the readme +- Changed variable name to be more sensical +- Altered how `next` redirection works so it's a little more robust + +-------------------- + Mon, 02 Sep 2019 09:42:24 -0500 Keaton Fixing functionality diff --git a/docs/example_dropin.png b/docs/example_dropin.png new file mode 100644 index 0000000000000000000000000000000000000000..4f158d41080703de50009a89cec08a281659cb88 GIT binary patch literal 68169 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index e64cd6a..fb93d6e 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,144 @@ # SQRL for Django +This package allows for developers to easily create SQRL-aware websites with a +few simple steps. + +**(This document was written for the future. Things that are not yet implemented +will be ~~struck out~~. Non-functional code snippets will be `#commented out`)** + This is a reboot of [Miki725's django-sqrl](https://github.com/miki725/django-sqrl), updated for Python 3.7 and Django 2.2. The vast majority of the code is unchanged, so all credit for this working belongs with them. -## Installation (eventually) +* Free software: MIT license +* GitHub: https://gitlab.com/WolfgangAxel/django-sqrl-2 +* ~~Documentation: https://django-sqrl-2.readthedocs.org~~ +* What is SQRL?: https://sqrl.grc.com/pages/what_is_sqrl/ +* SQRL documentation: https://www.grc.com/sqrl/sqrl.htm -It still isn't complete. This is placeholder. +## Installing + +### SQRL Package + +First step is to install `django-sqrl-2` which is easies to do using pip: + + $ python3 -m pip install #django-sqrl-2 + +### Django settings + +Once installed there are a few required changes in Django settings: + +* Make sure that some required Django apps are used: + + INSTALLED_APPS = [ + ..., + 'sqrl', + 'django.contrib.auth', + 'django.contrib.sessions', + 'django.contrib.staticfiles', + ] + +* Make sure that some required Django middleware are used: + + MIDDLEWARE_CLASSES = [ + ... + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + ] + +* Change `AUTHENTICATION_BACKENDS` to use SQRL backend vs Django's +`ModelBackend` (default): + + AUTHENTICATION_BACKENDS = [ + 'sqrl.backends.SQRLModelBackend', + ] + +* If you are using Django admin, following are required: + + * Make sure that `sqrl` is listed before `admin` in the `INSTALLED_APPS`. +This allows Django to prioritize `sqrl` templates since `django-sqrl` +overwrites some of them. + + INSTALLED_APPS = [ + ..., + 'sqrl', + 'django.contrib.admin', + ... + ] + + * Make sure to add a custom template directory in settings. `django-sqrl` +extends Django admin's `base.html` which by default causes infinite recursion. +To solve that, simply add a custom template directory which allows `django-sqrl` +to explicitly extend from `django.contrib.admin` `base.html` template: + + import os + import django + TEMPLATE_DIRS = [ + os.path.dirname(django.__file__), + ] +## URLs + +All of SQRL functionality is enabled by adding its URLs to the root URL config: + + from django.urls import path, include + + urlpatterns = [ + ... + path('sqrl/', include('sqrl.urls', namespace="sqrl")), + ... + ] + +If you use Django admin, the `/admin/sqrl_manage` will be available to manage +your site's SQRL identities. + +## Templates + +Now that SQRL is installed in your Django project, you can use it on any login +page with three simple template tag: + + {% load sqrl %} + {% sqrl as sqrl_session %} + {% sqrl_login_dropin sqrl_session [[a named redirect]] %} + +The [[named redirect]] is the page that should be redirected to after logging +in. Any name that can be resolved by django's `reverse` function will work (i.e. +`path("scheme/", view, name="example")` in the app `app` with namespace "app" +could be selected as `app:example`). + +These three tags will add a simple element to your login page: + +![A very basic SQRL QR code](docs/example_dropin.png "example dropin") + +If that doesn't suit your fancy, you may build your own template from the +following essential tags: + + {% load sqrl %} + {% sqrl as sqrl_session %} + +
+
+ + + +## Management Command + +SQRL uses server state to keep track of open SQRL transactions in order to +mitigate replay attacks. Since this state will constantly grow if not cleared, +`django-sqrl` provides a helper management command to clear expired states: + + $ python3 manage.py clearsqrlnuts + +It is recommended to run this command as repeating task. Here is an example +configuration for `cron`: + + */5 * * * * python manage.py clearsqrlnuts >/dev/null 2>&1 + +## ~~Testing~~ + +~~To run the tests, you need to install the testing requirements first:~~ + + $ #make install + +~~Then to run the tests, you can use use the Makefile command:~~ + + $ #make test diff --git a/sqrl/static/sqrl/sqrl.js b/sqrl/static/sqrl/sqrl.js index a41e330..b57429b 100644 --- a/sqrl/static/sqrl/sqrl.js +++ b/sqrl/static/sqrl/sqrl.js @@ -1,5 +1,16 @@ (function() { var get_next_url = function() { + // A Next defined in the URL has priority + var urlparam = document.URL.match(/next=([^&#]+)/) + if (urlparam.length == 2) { + return urlparam[1] + } + // Next highest priority is a defined SQRL_NEXT + if (typeof SQRL_NEXT !== "undefined") { + return SQRL_NEXT + } + // Lowest priority is the first input element + // named "next", otherwise return null var input = document.querySelectorAll('input[name="next"]'); return input.length > 0 ? input[0].value : null; }, diff --git a/sqrl/templates/admin/auth/user/sqrl_manage.html b/sqrl/templates/admin/auth/user/sqrl_manage.html index bfe943a..2ea7b6e 100644 --- a/sqrl/templates/admin/auth/user/sqrl_manage.html +++ b/sqrl/templates/admin/auth/user/sqrl_manage.html @@ -60,13 +60,13 @@

{% endif %} - {% sqrl as session_sqrl %} + {% sqrl as sqrl_session %}
SQRL Login - -
+
+
What is SQRL? {# redirect to manage page after successful SQRL transaction #} @@ -74,9 +74,9 @@
-
+
- +
diff --git a/sqrl/templates/admin/login.html b/sqrl/templates/admin/login.html index 83b4e38..ca11e50 100644 --- a/sqrl/templates/admin/login.html +++ b/sqrl/templates/admin/login.html @@ -57,9 +57,9 @@ - {% sqrl as session_sqrl %} + {% sqrl as sqrl_session %} -
+

or

@@ -69,21 +69,21 @@
- +
diff --git a/sqrl/templates/sqrl/login.html b/sqrl/templates/sqrl/login.html index 19b8cf1..d8694fa 100644 --- a/sqrl/templates/sqrl/login.html +++ b/sqrl/templates/sqrl/login.html @@ -11,8 +11,8 @@ Please use via SQRL using the information below.

- {% sqrl as session_sqrl %} - {% sqrl_login_dropin session_sqrl login %} + {% sqrl as sqrl_session %} + {% sqrl_login_dropin sqrl_session login %} {% endblock %} {% comment %} diff --git a/sqrl/templates/sqrl/manage.html b/sqrl/templates/sqrl/manage.html index eca65ac..2853fd8 100644 --- a/sqrl/templates/sqrl/manage.html +++ b/sqrl/templates/sqrl/manage.html @@ -32,8 +32,8 @@

{% endif %} - {% sqrl as session_sqrl %} - {% sqrl_login_dropin session_sqrl method="manage" %} + {% sqrl as sqrl_session %} + {% sqrl_login_dropin sqrl_session method="manage" %} {% endblock %} {% block scripts %} diff --git a/sqrl/templates/sqrl/sqrl-dropin.html b/sqrl/templates/sqrl/sqrl-dropin.html index 2d864dd..d8955ee 100644 --- a/sqrl/templates/sqrl/sqrl-dropin.html +++ b/sqrl/templates/sqrl/sqrl-dropin.html @@ -18,19 +18,19 @@ }
-
+ - +
- + diff --git a/sqrl/templatetags/sqrl.py b/sqrl/templatetags/sqrl.py index 2d596db..69daf2d 100644 --- a/sqrl/templatetags/sqrl.py +++ b/sqrl/templatetags/sqrl.py @@ -15,25 +15,25 @@ def sqrl(context): @register.inclusion_tag('sqrl/sqrl-dropin.html') -def sqrl_login_dropin(session_sqrl, redir): +def sqrl_login_dropin(sqrl_session, redir=""): """ Creates a drop-in SQRL element in your template pages. Add it to your login template to make it SQRL-aware. Usage: {% load sqrl %} - {% sqrl as session_sqrl %} - {% sqrl_login_dropin session_sqrl REDIR %} + {% sqrl as sqrl_session %} + {% sqrl_login_dropin sqrl_session REDIR %} REDIR is the registered name of the page to move to once the login - is completed. + is completed. It can be blank to not define a redirection. Notes: The drop-in is defaulted to a max-width of 300px. Set the width property of the parent if you want or need it smaller. You will likely want to change the font-size as well in this case. """ - return {'session_sqrl':session_sqrl, 'redir': reverse(redir)} + return {'sqrl_session':sqrl_session, 'redir': reverse(redir)} @register.simple_tag