django-pfx 1.4.dev16__tar.gz → 1.4.dev18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/PKG-INFO +1 -1
  2. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/conf.py +2 -1
  4. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/authentication.md +154 -0
  5. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/requirements.txt +1 -0
  6. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/.gitignore +0 -0
  7. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/.gitlab-ci.yml +0 -0
  8. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/.pre-commit-config.yaml +0 -0
  9. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/LICENSE +0 -0
  10. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/MANIFEST.in +0 -0
  11. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/README.md +0 -0
  12. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django-admin-test +0 -0
  13. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django_pfx.egg-info/SOURCES.txt +0 -0
  14. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django_pfx.egg-info/dependency_links.txt +0 -0
  15. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django_pfx.egg-info/requires.txt +0 -0
  16. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/django_pfx.egg-info/top_level.txt +0 -0
  17. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/Makefile +0 -0
  18. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/index.rst +0 -0
  19. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/api.views.rst +0 -0
  20. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/decorator.md +0 -0
  21. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/generate_openapi.md +0 -0
  22. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/getting_started.md +0 -0
  23. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/internationalisation.md +0 -0
  24. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/model.md +0 -0
  25. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/pfx_views.md +0 -0
  26. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/profiling.md +0 -0
  27. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/settings.md +0 -0
  28. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/doc/source/testing.md +0 -0
  29. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/img/pfx.png +0 -0
  30. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/img/pfx.svg +0 -0
  31. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/__init__.py +0 -0
  32. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/__init__.py +0 -0
  33. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/apidoc/__init__.py +0 -0
  34. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/apidoc/parameters.py +0 -0
  35. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/apidoc/schema.py +0 -0
  36. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/apidoc/tags.py +0 -0
  37. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/apps.py +0 -0
  38. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/decorator/__init__.py +0 -0
  39. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/decorator/rest.py +0 -0
  40. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/default_settings.py +0 -0
  41. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/exceptions.py +0 -0
  42. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/fields.py +0 -0
  43. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/http/__init__.py +0 -0
  44. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/http/json_response.py +0 -0
  45. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  46. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  47. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/management/__init__.py +0 -0
  48. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/management/commands/__init__.py +0 -0
  49. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  50. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/management/commands/profile.py +0 -0
  51. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/middleware/__init__.py +0 -0
  52. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/middleware/authentication.py +0 -0
  53. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/middleware/locale.py +0 -0
  54. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/middleware/profiling.py +0 -0
  55. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/__init__.py +0 -0
  56. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/cache_mixins.py +0 -0
  57. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/not_null_fields.py +0 -0
  58. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  59. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/pfx_models.py +0 -0
  60. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  61. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/serializers/__init__.py +0 -0
  62. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/serializers/json.py +0 -0
  63. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/settings.py +0 -0
  64. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/shortcuts.py +0 -0
  65. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/storage/__init__.py +0 -0
  66. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/storage/s3_storage.py +0 -0
  67. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  68. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  69. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  70. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  71. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/test.py +0 -0
  72. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/urls.py +0 -0
  73. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/__init__.py +0 -0
  74. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/authentication_views.py +0 -0
  75. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/fields.py +0 -0
  76. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/filters_views.py +0 -0
  77. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/locale_views.py +0 -0
  78. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  79. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  80. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/groups.py +0 -0
  81. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  82. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  83. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  84. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  85. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  86. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  87. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  88. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  89. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  90. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset.py +0 -0
  91. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  92. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  93. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  94. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  95. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  96. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pfx/pfxcore/views/rest_views.py +0 -0
  97. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/pyproject.toml +0 -0
  98. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/runtest.py +0 -0
  99. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/serve-doc +0 -0
  100. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/setup.cfg +0 -0
  101. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/setup.py +0 -0
  102. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/__init__.py +0 -0
  103. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  104. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/models.py +0 -0
  105. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/__init__.py +0 -0
  106. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/ci.py +0 -0
  107. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/common.py +0 -0
  108. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/dev.py +0 -0
  109. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/dev_custom_example.py +0 -0
  110. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/settings/dev_default.py +0 -0
  111. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/__init__.py +0 -0
  112. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/basic_api_errors.py +0 -0
  113. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/basic_api_test.py +0 -0
  114. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_api_doc.py +0 -0
  115. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_auth_api.py +0 -0
  116. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_body_mixin.py +0 -0
  117. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_cache.py +0 -0
  118. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_client.py +0 -0
  119. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_fields.py +0 -0
  120. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_filters.py +0 -0
  121. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_locale_api.py +0 -0
  122. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_perm_tests.py +0 -0
  123. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_perms_api.py +0 -0
  124. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_profiling_middleware.py +0 -0
  125. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_shortcuts.py +0 -0
  126. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_timezone_middleware.py +0 -0
  127. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_tools.py +0 -0
  128. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_user_queryset.py +0 -0
  129. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_view_decorators.py +0 -0
  130. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/tests/test_view_fields.py +0 -0
  131. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/urls.py +0 -0
  132. {django-pfx-1.4.dev16 → django-pfx-1.4.dev18}/tests/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev16
3
+ Version: 1.4.dev18
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev16
3
+ Version: 1.4.dev18
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -53,7 +53,8 @@ release = '1.0'
53
53
  # ones.
54
54
  extensions = ['myst_parser',
55
55
  'sphinx.ext.autodoc',
56
- 'sphinx.ext.autosummary']
56
+ 'sphinx.ext.autosummary',
57
+ 'sphinxcontrib.mermaid']
57
58
  autodoc_member_order = 'bysource'
58
59
 
59
60
  # Add any paths that contain templates here, relative to this directory.
@@ -48,12 +48,50 @@ To use the `CookieAuthenticationMiddleware`, you need to configure the following
48
48
 
49
49
  See the [MDN Website](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) for more details.
50
50
 
51
+ ### Multifactor Authentication
52
+ Multifactor authentication can be enabled in django-pfx Authentication API.
53
+
54
+ PFX currently provides MFA with One Time Password (OTP), compatible with FreeOTP,
55
+ Google Authenticator and other OTP app.
56
+
57
+ To enable this feature, install django-pfx with otp
58
+
59
+ ```bash
60
+ pip install django-pfx[otp]
61
+ ```
62
+
63
+ Then the user class must use the ```OtpUserMixin```
64
+
65
+ ```python
66
+ from django.contrib.auth.models import AbstractUser
67
+ from pfx.pfxcore.models import OtpUserMixin
68
+
69
+ class MyUser(OtpUserMixin, AbstractUser):
70
+ pass
71
+ ```
72
+
73
+ The user can then enable or disable the OTP auth using the [services documented below](#enable-mfa-otp).
74
+
51
75
  ## Services
52
76
 
53
77
  ### Login
54
78
  A login rest services with a `mode` parameter to choose between JWT bearer token or cookie authentication.
55
79
  In cookie mode, the JWT token is saved in an HTTP-only cookie.
56
80
 
81
+ ```{mermaid}
82
+
83
+ sequenceDiagram
84
+ participant App
85
+ participant API
86
+ App->>API: POST /auth/login
87
+ alt Authentication success
88
+ API->>App: 200 OK + cookie
89
+ else Authentication failed
90
+ API->>App: 401 Unautorized
91
+ end
92
+
93
+ ```
94
+
57
95
  **Request :** `POST` `/auth/login?mode=<mode>`
58
96
 
59
97
  **Request body:**
@@ -75,6 +113,122 @@ In cookie mode, the JWT token is saved in an HTTP-only cookie.
75
113
  | user | the user object |
76
114
 
77
115
 
116
+ ### Login + TOTP
117
+ If the user has enabled the TOTP login, the process is the same as above for the first step,
118
+ except that the login service returns a temporary JWT token valid only for the otp services.
119
+
120
+ ```{mermaid}
121
+
122
+ sequenceDiagram
123
+ participant App
124
+ participant API
125
+ App->>API: POST /auth/login
126
+ alt Login success
127
+ API->>App: 200 OK
128
+ note left of API: temporary jwt token
129
+ App->>API: POST /auth/otp/login
130
+ note right of App: temporary jwt token + OTP token in body.
131
+ alt OTP success
132
+ API->>App: 200 OK
133
+ note left of API: JWT token in cookie or in body <br/> + user in body
134
+ else OTP failed
135
+ API->>App: 401 Unautorized
136
+ end
137
+ else Login failed
138
+ API->>App: 401 Unautorized
139
+ end
140
+
141
+ ```
142
+
143
+ **Request :** `POST` `/auth/login?mode=<mode>`
144
+
145
+ **Request body:**
146
+
147
+ | Field | Description |
148
+ |-------------|-------------------------------------|
149
+ | username | the username |
150
+ | password | the password |
151
+ | remember_me | If true, use a long validity token. |
152
+
153
+ **Responses :**
154
+
155
+ * `HTTP 401` if the credentials are incorrect
156
+ * `HTTP 200` with the following body
157
+
158
+ | Field | Description |
159
+ |-------|-----------------------|
160
+ | token | a temporary jwt token |
161
+
162
+
163
+ **Request :** `POST` `/auth/otp/login?mode=<mode>`
164
+
165
+ **Request body:**
166
+
167
+ | Field | Description |
168
+ |-------------|-------------------------------------|
169
+ | token | the temporary jwt token |
170
+ | otp | the one time password (TOTP) |
171
+
172
+ **Responses :**
173
+
174
+ * `HTTP 401` if the temporary jwt token is incorrect
175
+ * `HTTP 403` if the otp is incorrect
176
+ * `HTTP 200` with the following body
177
+
178
+ | Field | Description |
179
+ |-------|----------------------------------------|
180
+ | token | the jwt token. (only if mode is 'jwt') |
181
+ | user | the user object |
182
+
183
+ ### Enable MFA OTP
184
+ Services to enable the MFA with OTP.
185
+ You have to call first the `activate` service to get the URI,
186
+ encode it as a QR code and present it in the UI of your software.
187
+ Then user then scans this QR code to add the OTP secret to his OTP App.
188
+ Finally, the `confirm` service must be called with an OTP code retrieved
189
+ in the OTP App to confirm the activation.
190
+
191
+ **Request :** `PUT` `/auth/otp/activate`
192
+
193
+ **Responses :**
194
+
195
+ * `HTTP 400` if the otp is already enabled
196
+ * `HTTP 200` with the following body
197
+
198
+ | Field | Description |
199
+ |-----------|---------------------------------------|
200
+ | setup_uri | the uri to enable the OTP application |
201
+
202
+ **Request :** `PUT` `/auth/otp/confirm`
203
+
204
+ **Request body:**
205
+
206
+ | Field | Description |
207
+ |-------------|---------------------------------------|
208
+ | otp_code | the otp code retrieved in the OTP app |
209
+
210
+ **Responses :**
211
+
212
+ * `HTTP 422` if the otp code is invalid
213
+ * `HTTP 200` if the otp code is valid
214
+
215
+ ### Disable MFA OTP
216
+ A service to disable the MFA with OTP.
217
+
218
+ **Request :** `PUT` `/auth/otp/disable`
219
+
220
+ **Request body:**
221
+
222
+ | Field | Description |
223
+ |-------------|---------------------------------------|
224
+ | otp_code | the otp code retrieved in the OTP app |
225
+
226
+ **Responses :**
227
+
228
+ * `HTTP 422` if the otp code is invalid
229
+ * `HTTP 200` if the otp code is valid
230
+
231
+
78
232
  ### Logout
79
233
  A service that deletes the authentication cookie if it exists.
80
234
 
@@ -14,6 +14,7 @@ apispec
14
14
  sphinx
15
15
  myst-parser
16
16
  sphinx-rtd-theme
17
+ sphinxcontrib-mermaid
17
18
  dill
18
19
  apispec
19
20
  pyyaml
File without changes
File without changes
File without changes
File without changes
File without changes