Skip to content

Commit 2308515

Browse files
authored
408 Add in depth documentation about MFA (#411)
* add link to `create_admin` function * add links to `MFAProvider` and subclasses * add an example * add docs about creating the DB table
1 parent 40e4952 commit 2308515

File tree

1 file changed

+72
-3
lines changed

1 file changed

+72
-3
lines changed

docs/source/mfa/index.rst

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,76 @@ Multi-factor Authentication
22
===========================
33

44
Piccolo Admin supports Multi-factor Authentication (MFA). See the
5-
``mfa_providers`` argument in ``create_admin``.
5+
``mfa_providers`` argument in :func:`create_admin <piccolo_admin.endpoints.create_admin>`.
66

7-
We currently recommend using the ``AuthenticatorProvider`` with
8-
``XChaCha20Provider`` for encryption.
7+
Most of the underlying functionality comes from ``piccolo_api``.
8+
9+
``MFAProvider``
10+
---------------
11+
12+
We currently recommend using the :class:`AuthenticatorProvider <piccolo_api.mfa.authenticator.provider.AuthenticatorProvider>`
13+
(which uses an authenticator app for generating codes) with
14+
:class:`XChaCha20Provider <piccolo_api.encryption.providers.XChaCha20Provider>`
15+
for encryption.
16+
17+
You can also implement your own subclass of :class:`MFAProvider <piccolo_api.mfa.provider.MFAProvider>`
18+
if you want to do something custom.
19+
20+
Example
21+
-------
22+
23+
.. code-block:: python
24+
25+
from piccolo_admin.endpoints import create_admin
26+
from piccolo_api.encryption.providers import XChaCha20Provider
27+
from piccolo_api.mfa.authenticator.provider import AuthenticatorProvider
28+
29+
30+
app = create_admin(
31+
...,
32+
mfa_providers=[
33+
AuthenticatorProvider(
34+
encryption_provider=XChaCha20Provider(
35+
encryption_key=(
36+
b"my_encryption_key"
37+
)
38+
),
39+
)
40+
]
41+
)
42+
43+
To generate the encryption key in the above example:
44+
45+
.. code-block:: pycon
46+
47+
>>> from piccolo_api.encryption.providers import XChaCha20Provider
48+
>>> XChaCha20Provider.generate_key()
49+
b'\xb7(\xa5\xa6\xa4&\xeb\x8eI\xfe_Y\x16\x12\xf4\xf4\xa8|\xc6#\xd1\x02\xa2s\x03]\xea\x12\xb9\xf1\xa2\xb3'
50+
51+
.. note::
52+
Piccolo Admin currently allows you to use a single ``MFAProvider``, but
53+
this might change in the future.
54+
55+
Install dependencies
56+
--------------------
57+
58+
For the above example, you need to install some extra dependencies:
59+
60+
.. code-block:: bash
61+
62+
pip install piccolo_api[authenticator,pynacl]
63+
64+
Create database table
65+
---------------------
66+
67+
You need to create the database table for storing the MFA secrets, either by:
68+
69+
* Adding ``"piccolo_api.mfa.authenticator.piccolo_app"`` to your ``AppRegistry``
70+
in ``piccolo_conf.py``, then running the migrations using
71+
``piccolo migrations forwards all``.
72+
* Manually creating the table.
73+
74+
.. code-block:: pycon
75+
76+
>>> from piccolo_api.mfa.authenticator.tables import AuthenticatorSecret
77+
>>> AuthenticatorSecret.create_table().run_sync()

0 commit comments

Comments
 (0)