multi factor authentication for django
Project description
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
- Add
'mfa'
toINSTALLED_APPS
- Use
mfa.views.LoginView
instead of the regular login view - Set
MFA_DOMAIN = 'example.com'
andMFA_SITE_TITLE = 'My site'
- Register URLs:
path('mfa/', include('mfa.urls', namespace='mfa')
- The included templates are just examples, so you should replace them with your own
- 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 redirect all authenticated
requests to 'mfa:list'
as long as the user has no MFAKeys. You can use
mfa.decorators.public
to add exceptions.
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. The example frontend code also uses cbor-js.
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.
It is recommended to use django-mfa3 with django-axes for rate limiting. It is also compatible with 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_mfa3-0.4.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6089080c506e5da6062d160ad99aec534720a8f52be6dbf36851c3766eee3821 |
|
MD5 | b37e4f1bd119c98a5af1a0d3548345ba |
|
BLAKE2b-256 | e2c0acfa3cadb6f7996ba4bc89db472a5da2b5c06c03462c64897f826cf9ddd4 |