Metadata-Version: 2.4
Name: django-mail-auth
Version: 3.5.2
Summary: Django authentication via login URLs, no passwords required.
Keywords: django,otp,email,authentication,passwordless
Author-email: Johannes Maron <johannes@maron.family>
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Framework :: Django
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
Classifier: Framework :: Wagtail
Classifier: Framework :: Wagtail :: 6
Classifier: Framework :: Wagtail :: 7
Classifier: Topic :: Internet
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: Software Development :: Testing
License-File: LICENSE
Requires-Dist: django>=4.2
Requires-Dist: mkdocs ; extra == "docs"
Requires-Dist: mkdocstrings[python]>=0.18 ; extra == "docs"
Requires-Dist: mkdocs-material ; extra == "docs"
Requires-Dist: markdown-callouts ; extra == "docs"
Requires-Dist: Pygments ; extra == "docs"
Requires-Dist: django-citext ; extra == "postgres"
Requires-Dist: pytest ; extra == "test"
Requires-Dist: pytest-cov ; extra == "test"
Requires-Dist: pytest-django ; extra == "test"
Requires-Dist: wagtail>=6.3 ; extra == "wagtail"
Project-URL: Changelog, https://github.com/codingjoe/django-mail-auth/releases
Project-URL: Documentation, https://django-mail-auth.rtfd.io/
Project-URL: Issue-Tracker, https://github.com/codingjoe/django-mail-auth/issues
Project-URL: Project-URL, https://github.com/codingjoe/django-mail-auth
Project-URL: Source, https://github.com/codingjoe/django-mail-auth
Provides-Extra: docs
Provides-Extra: postgres
Provides-Extra: test
Provides-Extra: wagtail

<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://github.com/codingjoe/django-mail-auth/raw/main/images/logo-dark.svg">
    <source media="(prefers-color-scheme: light)" srcset="https://github.com/codingjoe/django-mail-auth/raw/main/images/logo-light.svg">
    <img alt="Django MailAuth: Secure login links; no passwords required!" src="https://github.com/codingjoe/django-mail-auth/raw/main/images/logo-light.svg">
  </picture>
</p>

# Django Mail Auth

[![version](https://img.shields.io/pypi/v/django-mail-auth.svg)](https://pypi.python.org/pypi/django-mail-auth/)
[![Documentation Status](https://readthedocs.org/projects/django-mail-auth/badge/?version=latest)](https://django-mail-auth.readthedocs.io/en/latest/?badge=latest)
[![coverage](https://codecov.io/gh/codingjoe/django-mail-auth/branch/main/graph/badge.svg)](https://codecov.io/gh/codingjoe/django-mail-auth)
[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/codingjoe/django-mail-auth/main/LICENSE)

Django Mail Auth is a lightweight authentication backend for Django,
that does not require users to remember passwords.

Django Mail Auth features:

- custom user model support
- drop in Django admin support
- drop in Django User replacement
- drop in Wagtail login replacement
- extendable SMS support

![](sample.png){alt="screenshot from a login form" width="425px"}

This project was inspired by:

- [Is it time for password-less login?](http://notes.xoxco.com/post/27999787765/is-it-time-for-password-less-login)
  by [Ben Brown](http://twitter.com/benbrown)
- [LOGIN WITHOUT PASSWORD MOST SECURE | WAIT.. WHAT?](https://www.lucius.digital/en/blog/login-without-password-most-secure-wait-what)
  by [Joris Snoek](https://twitter.com/lucius_digital)
- [django-nopassword](https://github.com/relekang/django-nopassword) by
  [Rolf Erik Lekang](http://rolflekang.com)

## Installation

Run this command to install `django-mail-auth`:

```
python3 -m pip install django-mail-auth[wagtail]
```

## Setup

First add `mailauth` to you installed apps:

```python
INSTALLED_APPS = [
    # Django's builtin apps…
    "mailauth",
    "mailauth.contrib.admin",  # optional
    "mailauth.contrib.user",  # optional
    # optional, must be included before "wagtail.admin"
    "mailauth.contrib.wagtail",
    # other apps…
]
```

`mailauth.contrib.admin` is optional and will replace the admin's login
with token based authentication too.

`mailauth.contrib.user` is optional and provides a new Django User
model. The new User model needs to be enabled via the `AUTH_USER_MODEL`
setting:

```python
# This setting should be either "EmailUser" or
# any custom subclass of "AbstractEmailUser"
AUTH_USER_MODEL = "mailauth_user.EmailUser"

# optional, Wagtail only
WAGTAILUSERS_PASSWORD_ENABLED = False
```

Next you will need to add the new authentication backend:

```python
AUTHENTICATION_BACKENDS = (
    # default, but now optional
    # This should be removed if you use mailauth.contrib.user or any other
    # custom user model that does not have a username/password
    "django.contrib.auth.backends.ModelBackend",
    # The new access token based authentication backend
    "mailauth.backends.MailAuthBackend",
)
```

Django's `ModelBackend` is only needed, if you still want to support
password based authentication. If you don't, simply remove it from the
list.

Last but not least, go to your URL root configuration `urls.py` and add
the following:

```python
from django.urls import path


urlpatterns = [
    path("accounts/", include("mailauth.urls")),
    # optional, must be before "wagtail.admin.urls"
    path("", include("mailauth.contrib.wagtail.urls")),
]
```

That's it!

> [!IMPORTANT]
> Don't forget to setup you Email backend!

