Skip to main content

User profile management app

Project description

django-sso-app

User profile management app built upon django-allauth library and cookiecutter-django as scaffold. Optionally integrates with kong API gateway.

(This is alpha software and is under heavy development)

Tech

Design decisions

  • After login both JWT and Session Token will be sent to the requesting browser
  • Single e-mail address for each user
  • Django staff users (is_staff and is_superuser) must login through django admin view
  • User logout on password change
  • New users username is set to email
  • While profile completed_at is None user can update username
  • When apigateway is enabled, users with completed_at set to None are on "incomplete" group
  • User login on email confirmation

Available configurations (Shapes)

  1. Backend only:

    Users profile informations are saved into django project with django-sso-app installed.

    DJANGO_SSO_APP_SHAPE = 'backend_only'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    
  2. Backend + Api Gateway

    As point 1 but with an api gateway (i.e. kong) proxying authenticated requests to backend. By logging in the client receives a JWT crafted by backend with the api gateway generated secret.

    DJANGO_SSO_APP_SHAPE = 'backend_only_apigateway'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    DJANGO_SSO_APP_APIGATEWAY_HOST = 'kong'
    
  3. Backend + App

    User profile informations are saved into a django-sso-app instance, all protected django projects have django-sso-app installed and configured to authenticate users by django-sso-app generated JWT. By logging in the client receives a JWT crafted by backend.

    # Backend config
    DJANGO_SSO_APP_SHAPE = 'backend_app'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ..]
    
    # App config
    DJANGO_SSO_APP_SHAPE = 'app'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    
  4. Backend + App + Persistence

    As point 3 but protected projects keep user profiles aligned with django-sso-app instance.

    # Backend config
    DJANGO_SSO_APP_SHAPE = 'backend_app'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    
    # App config
    DJANGO_SSO_APP_SHAPE = 'app_persistence'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    
  5. Backend + App + Api Gateway

    As point 3 but with an api gateway proxying authenticated requests to django projects.

    Protected projects authenticate users by the X-Consumer-Username header set by api gateway. By logging in the client receives a JWT crafted by backend with the api gateway generated secret. All requests to protected services are authenticated by the JWT included in cookie (or header).

    # Backend config
    DJANGO_SSO_APP_SHAPE = 'backend_app_apigateway'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    DJANGO_SSO_APP_APIGATEWAY_HOST = 'http://kong:8001'
    
    # App config
    DJANGO_SSO_APP_SHAPE = 'app_apigateway'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    
  6. Backend + App + Persistence + Api Gateway

    As point 5 but protected projects keep user profiles aligned with django-sso-app instance.

    # Backend config
    DJANGO_SSO_APP_SHAPE = 'backend_app_apigateway'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    DJANGO_SSO_APP_APIGATEWAY_HOST = 'http://kong:8001'
    
    # App config
    DJANGO_SSO_APP_SHAPE = 'app_persistence_apigateway'
    DJANGO_SSO_APP_BACKEND_DOMAINS = ['1.accounts.domain', ...]
    

Note

Seamless switch between aforementioned configurations is mandatory in order to simplify scaling.

Setup

Config vars

Required

  • APP_DOMAIN

    i.e. accounts.example.com (default='localhost:8000')

  • DJANGO_SSO_APP_SHAPE

    One of backend_only, backend_only_apigateway, backend_app, app, app_persistence, app_apigateway, app_persistence_apigateway (default='backend_only').

Custom (Shape related)

  • COOKIE_DOMAIN

    JWT cookie domain (default=APP_DOMAIN)

  • I18N_PATH_ENABLED

    Enables i18n paths (default=True)

  • DJANGO_SSO_APP_APIGATEWAY_HOST

    Api gateway instance url (default='http://kong:8001')

  • DJANGO_SSO_APP_BACKEND_CUSTOM_FRONTEND_APP

    Custom frontend package (default=None)

  • DJANGO_SSO_APP_BACKEND_DOMAINS

    List of backend domains (default=[APP_DOMAIN])

Behaviours

  • DJANGO_SSO_APP_LOGOUT_DELETES_ALL_PROFILE_DEVICES

    Either delete or not other profile devices on logout (default=True)

Django

backend.users.models

from django.contrib.auth.models import AbstractUser
from django_sso_app.core.apps.users.models import DjangoSsoAppUserModelMixin

class User(AbstractUser, DjangoSsoAppUserModelMixin):
    pass

backend.users.forms

from django_sso_app.backend.users.forms import (UserCreationForm as DjangoSsoAppUserCreationForm,
                                                UserChangeForm as DjangoSsoAppUserChangeForm)

class UserChangeForm(DjangoSsoAppUserChangeForm):
    pass

class UserCreationForm(DjangoSsoAppUserCreationForm):
    pass

backend.users.admin

from django.contrib import admin
from django.contrib.auth import get_user_model

from django_sso_app.core.apps.users.admin import UserAdmin

User = get_user_model()

admin.site.register(User, UserAdmin)

settings.py

from django_sso_app.settings import *

DJANGO_SSO_APP_SHAPE = env('DJANGO_SSO_APP_SHAPE', default='backend_only')
DJANGO_SSO_APP_APIGATEWAY_HOST = env('DJANGO_SSO_APP_APIGATEWAY_HOST', default='kong')
BACKEND_CUSTOM_FRONTEND_APP = env('BACKEND_CUSTOM_FRONTEND_APP', default=None)

LOCAL_APPS = ["backend.users.apps.UsersConfig"]  # ...

LOCAL_APPS += DJANGO_SSO_APP_DJANGO_APPS

MIDDLEWARE = [
    ...
    'django_sso_app.core.authentication.backends.DjangoSsoAppLoginAuthenticationBackend',

    'django_sso_app.core.authentication.middleware.DjangoSsoAppAuthenticationMiddleware',
    ...
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
] + DJANGO_SSO_APP_DJANGO_AUTHENTICATION_BACKENDS


AUTH_USER_MODEL = 'users.User'
LOGIN_URL = '/login/'

DRF_DEFAULT_AUTHENTICATION_CLASSES = [
    'rest_framework.authentication.TokenAuthentication'
    'django_sso_app.core.api.authentication.DjangoSsoApiAuthentication'
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': DRF_DEFAULT_AUTHENTICATION_CLASSES,
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

urls.py

urlpatterns = []
api_urlpatterns = []
_I18N_URLPATTERNS = []

from django_sso_app.urls import (urlpatterns as django_sso_app__urlpatterns,
                                 api_urlpatterns as django_sso_app__api_urlpatterns,
                                 i18n_urlpatterns as django_sso_app_i18n_urlpatterns)
from django_sso_app.core.mixins import WebpackBuiltTemplateViewMixin

urlpatterns += django_sso_app__urlpatterns
api_urlpatterns += django_sso_app__api_urlpatterns
_I18N_URLPATTERNS += django_sso_app_i18n_urlpatterns

urlpatterns += [
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^jsi18n/$', ...
]

_I18N_URLPATTERNS += [
    path('', WebpackBuiltTemplateViewMixin.as_view(template_name='pages/home.html'), name='home'),
    path('about/', WebpackBuiltTemplateViewMixin.as_view(template_name='pages/about.html'), name='about'),

    # Django Admin, use {% url 'admin:index' %}
    path(settings.ADMIN_URL, admin.site.urls),
]

if settings.I18N_PATH_ENABLED:
    urlpatterns += i18n_patterns(
        *_I18N_URLPATTERNS
    )
else:
    urlpatterns += _I18N_URLPATTERNS

Project details


Release history Release notifications | RSS feed

This version

0.8.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-sso-app-0.8.1.tar.gz (217.6 kB view details)

Uploaded Source

Built Distribution

django_sso_app-0.8.1-py2.py3-none-any.whl (300.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-sso-app-0.8.1.tar.gz.

File metadata

  • Download URL: django-sso-app-0.8.1.tar.gz
  • Upload date:
  • Size: 217.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.7.8

File hashes

Hashes for django-sso-app-0.8.1.tar.gz
Algorithm Hash digest
SHA256 62b4389d04282381510956a13e43c350c3df91d0c3d7114e8ea98e9a814c9126
MD5 3b035b20d3f71df99ee316467ddef45a
BLAKE2b-256 4a6c0cb6f0ffb91ab79ac5b4b1d19cedf0a3355cea403533f4613c8898b11c65

See more details on using hashes here.

File details

Details for the file django_sso_app-0.8.1-py2.py3-none-any.whl.

File metadata

  • Download URL: django_sso_app-0.8.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 300.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.7.8

File hashes

Hashes for django_sso_app-0.8.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 938080e7b63411df01de876e069bfebdd840568be710e96f7a99ebc6e884876c
MD5 6d9f03e6e642310a08f45da0109a5d3e
BLAKE2b-256 efbfdb7605af73f7a68ccdb97ef563b291c5d8cb7e51457d756fcace45218b58

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page