Skip to main content

django-mfa3

An opinionated Django app that handles multi factor authentication (MFA) via FIDO2, TOTP, and recovery codes.

Features

  • Two factor authentication is required on login (if the user has registered a key)
  • Stuff just works without much configuration
  • The UI allows to add new keys and to remove keys that have been compromised
  • You can optionally enforce MFA for all users
  • You can (and should) customize the templates
  • Simple code, few dependencies

Installation

pip install django-mfa3

Usage

  1. Add 'mfa' to INSTALLED_APPS
  2. Use mfa.views.LoginView instead of the regular login view. (Be sure to remove any other login routes, otherwise the multi factor authentication can be circumvented. The admin login will automatically be patched to redirect to the regular login.)
  3. Set MFA_DOMAIN = 'example.com' and MFA_SITE_TITLE = 'My site'. See settings.py for a full list of settings.
  4. Register URLs: path('mfa/', include('mfa.urls', namespace='mfa')
  5. The included templates are just examples, so you should replace them with your own
  6. FIDO2 requires client side code. You can either implement it yourself or use the included fido2.js.
  7. Somewhere in your app, add a link to 'mfa:list'

Enforce MFA

Optionally, you can add 'mfa.middleware.MFAEnforceMiddleware' to MIDDLEWARE (after AuthenticationMiddleware!). It will force users to setup two factor authentication by redirecting all authenticated requests to 'mfa:list' as long as the user has no MFAKeys. You can use mfa.decorators.public to add exceptions.

Send email on failed login attempt

If someone failes to login on the second factor that might indicate that the first factor (password) has been compromised. django-mfa3 will automatically send a warning to affected users under the following conditions:

  • Django needs to be configured for sending email
  • There must be an email address associated with the user account
  • You need to provide some templates
    • mfa/login_failed_subject.txt: optional, a default is included
    • mfa/login_failed_email.txt: required, an example is included in the tests
    • mfa/login_failed_email.html: optional

All templates have access to the following context data: email, domain, site_name, user, method.

Status

I am not sure whether I will be able to maintain this library long-term. If you would like to help or even take ownership of this project, please contact me!

Related projects

django-mfa3 is based on pyotp and python-fido2.

It is inspired by but not otherwise affiliated with django-mfa2. A big difference between the two projects is that django-mfa2 supports many methods, while django-mfa3 only supports FIDO2 and TOTP. U2F was dropped because it is now superseded by FIDO2. Email and Trusted Devices were dropped because I felt like they have inferior security properties compared to FIDO2 and TOTP.

Another major inspiration is django-otp. It is probably the most mature library when it comes to two factor authentication in django. However, its basic structure is not compatible with FIDO2.

django-mfa3 is compatible with django-axes and django-stronghold.

Security considerations

The actual cryptography is handled by pyotp and python-fido2. This library only provides the glue code for django. Still, there could be issues in the glue.

A notable attack surface is server state: The authentication consists of three separate HTTP requests: The regular login, fetching a challenge, and a response. The server keeps some state in the session across these requests. For example, the user is temporarily stored in the session until the second factor authentication is done. The logic for handling this state is not as straight forward as I would like and there might be issues hidden in there.

Please also be careful when implementing and using this library in your project to prevent higher level security or usability issues. Please refer to other guidelines like the OWASP Cheat Sheet for more informaton on that topic.

Download files

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

Source Distribution

django_mfa3-1.1.1.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_mfa3-1.1.1-py3-none-any.whl (26.4 kB view details)

Uploaded Python 3

File details

Details for the file django_mfa3-1.1.1.tar.gz.

File metadata

  • Download URL: django_mfa3-1.1.1.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_mfa3-1.1.1.tar.gz
Algorithm Hash digest
SHA256 1e9f80fbce3f13d2f2f0d956522f1ecf3b75f6802d6877647256dc6bf33335be
MD5 0861845237f90f4dbe99ed8b4d1fc50b
BLAKE2b-256 adad2c68afa521f864bf6ab6a717664f3ef80eae37370510fd52e69ba8c1e743

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_mfa3-1.1.1.tar.gz:

Publisher: main.yml on xi/django-mfa3

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_mfa3-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: django_mfa3-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 26.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_mfa3-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f756758bef8dcab51555883631a3d36ae41a71cc65dff92076e74ad785d90f37
MD5 d8ae7a9e70ba8dd5c521e2af03a79c1c
BLAKE2b-256 a44b1e22561a6630651cad99085048cda70081ccd52a048b492cc5a1db4b8338

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_mfa3-1.1.1-py3-none-any.whl:

Publisher: main.yml on xi/django-mfa3

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.1.1 This release

2 files

1.1.0

2 files

1.0.0

2 files

0.15.2

2 files

0.15.1

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.1

2 files

0.11.0

1 file

0.10.0

1 file

0.9.0

1 file

0.8.0

1 file

0.7.0

1 file

0.6.0

1 file

0.5.1

1 file

0.5.0

1 file

0.4.0

2 files

0.3.0

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

1 file

0.1.0

1 file

0.0.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page