@djangocfg/api 2.1.360 → 2.1.361
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.
- package/dist/auth-server.cjs +1 -0
- package/dist/auth-server.cjs.map +1 -1
- package/dist/auth-server.mjs +1 -0
- package/dist/auth-server.mjs.map +1 -1
- package/dist/auth.cjs +1 -0
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.mjs +1 -0
- package/dist/auth.mjs.map +1 -1
- package/dist/clients.cjs +1 -0
- package/dist/clients.cjs.map +1 -1
- package/dist/clients.mjs +1 -0
- package/dist/clients.mjs.map +1 -1
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.mjs +1 -0
- package/dist/hooks.mjs.map +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/_api/generated/_cfg_accounts/openapi.json +1811 -0
- package/src/_api/generated/_cfg_centrifugo/openapi.json +132 -0
- package/src/_api/generated/_cfg_totp/openapi.json +927 -0
- package/src/_api/generated/helpers/auth.ts +13 -2
- package/src/_api/generated/openapi.json +2789 -0
|
@@ -0,0 +1,927 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.1.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Django CFG API",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"description": "RESTful API with modern architecture"
|
|
7
|
+
},
|
|
8
|
+
"paths": {
|
|
9
|
+
"/cfg/totp/backup-codes/": {
|
|
10
|
+
"get": {
|
|
11
|
+
"operationId": "cfg_totp_backup_codes_retrieve",
|
|
12
|
+
"description": "Get backup codes status for user.",
|
|
13
|
+
"tags": [
|
|
14
|
+
"cfg_totp_backup_codes"
|
|
15
|
+
],
|
|
16
|
+
"security": [
|
|
17
|
+
{
|
|
18
|
+
"apiKeyAuth": []
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"jwtAuthWithLastLogin": []
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"responses": {
|
|
25
|
+
"200": {
|
|
26
|
+
"content": {
|
|
27
|
+
"application/json": {
|
|
28
|
+
"schema": {
|
|
29
|
+
"$ref": "#/components/schemas/BackupCodesStatus"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"description": ""
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"x-async-capable": false
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"/cfg/totp/backup-codes/regenerate/": {
|
|
40
|
+
"post": {
|
|
41
|
+
"operationId": "cfg_totp_backup_codes_regenerate_create",
|
|
42
|
+
"description": "Regenerate backup codes.\n\nRequires TOTP code for verification.\nInvalidates all existing codes.",
|
|
43
|
+
"tags": [
|
|
44
|
+
"cfg_totp_backup_codes"
|
|
45
|
+
],
|
|
46
|
+
"requestBody": {
|
|
47
|
+
"content": {
|
|
48
|
+
"application/json": {
|
|
49
|
+
"schema": {
|
|
50
|
+
"$ref": "#/components/schemas/BackupCodesRegenerateRequest"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"required": true
|
|
55
|
+
},
|
|
56
|
+
"security": [
|
|
57
|
+
{
|
|
58
|
+
"apiKeyAuth": []
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"jwtAuthWithLastLogin": []
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"responses": {
|
|
65
|
+
"200": {
|
|
66
|
+
"content": {
|
|
67
|
+
"application/json": {
|
|
68
|
+
"schema": {
|
|
69
|
+
"$ref": "#/components/schemas/BackupCodesRegenerateResponse"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"description": ""
|
|
74
|
+
},
|
|
75
|
+
"400": {
|
|
76
|
+
"content": {
|
|
77
|
+
"application/json": {
|
|
78
|
+
"schema": {
|
|
79
|
+
"description": "Invalid code or 2FA not enabled"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"description": ""
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"x-async-capable": false
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"/cfg/totp/devices/": {
|
|
90
|
+
"get": {
|
|
91
|
+
"operationId": "cfg_totp_devices_retrieve",
|
|
92
|
+
"description": "List all TOTP devices for user.",
|
|
93
|
+
"tags": [
|
|
94
|
+
"cfg_totp"
|
|
95
|
+
],
|
|
96
|
+
"security": [
|
|
97
|
+
{
|
|
98
|
+
"apiKeyAuth": []
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"jwtAuthWithLastLogin": []
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"responses": {
|
|
105
|
+
"200": {
|
|
106
|
+
"content": {
|
|
107
|
+
"application/json": {
|
|
108
|
+
"schema": {
|
|
109
|
+
"$ref": "#/components/schemas/DeviceListResponse"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"description": ""
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"x-async-capable": false
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"/cfg/totp/devices/{id}/": {
|
|
120
|
+
"delete": {
|
|
121
|
+
"operationId": "cfg_totp_devices_destroy",
|
|
122
|
+
"description": "Delete a TOTP device.\n\nRequires verification code if removing the last/primary device.",
|
|
123
|
+
"parameters": [
|
|
124
|
+
{
|
|
125
|
+
"in": "path",
|
|
126
|
+
"name": "id",
|
|
127
|
+
"schema": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"format": "uuid"
|
|
130
|
+
},
|
|
131
|
+
"required": true
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"tags": [
|
|
135
|
+
"cfg_totp"
|
|
136
|
+
],
|
|
137
|
+
"security": [
|
|
138
|
+
{
|
|
139
|
+
"apiKeyAuth": []
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"jwtAuthWithLastLogin": []
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"responses": {
|
|
146
|
+
"204": {
|
|
147
|
+
"description": "No response body"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"x-async-capable": false
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"/cfg/totp/disable/": {
|
|
154
|
+
"post": {
|
|
155
|
+
"operationId": "cfg_totp_disable_create",
|
|
156
|
+
"description": "Completely disable 2FA for account.\n\nRequires verification code.",
|
|
157
|
+
"tags": [
|
|
158
|
+
"cfg_totp"
|
|
159
|
+
],
|
|
160
|
+
"requestBody": {
|
|
161
|
+
"content": {
|
|
162
|
+
"application/json": {
|
|
163
|
+
"schema": {
|
|
164
|
+
"$ref": "#/components/schemas/DisableRequest"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"required": true
|
|
169
|
+
},
|
|
170
|
+
"security": [
|
|
171
|
+
{
|
|
172
|
+
"apiKeyAuth": []
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"jwtAuthWithLastLogin": []
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
"responses": {
|
|
179
|
+
"200": {
|
|
180
|
+
"content": {
|
|
181
|
+
"application/json": {
|
|
182
|
+
"schema": {
|
|
183
|
+
"description": "2FA disabled successfully"
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"description": ""
|
|
188
|
+
},
|
|
189
|
+
"400": {
|
|
190
|
+
"content": {
|
|
191
|
+
"application/json": {
|
|
192
|
+
"schema": {
|
|
193
|
+
"description": "Invalid code"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"description": ""
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"x-async-capable": false
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
"/cfg/totp/setup/": {
|
|
204
|
+
"post": {
|
|
205
|
+
"operationId": "cfg_totp_setup_create",
|
|
206
|
+
"description": "Start 2FA setup process.\n\nCreates a new TOTP device and returns QR code for scanning.",
|
|
207
|
+
"tags": [
|
|
208
|
+
"cfg_totp_setup"
|
|
209
|
+
],
|
|
210
|
+
"requestBody": {
|
|
211
|
+
"content": {
|
|
212
|
+
"application/json": {
|
|
213
|
+
"schema": {
|
|
214
|
+
"$ref": "#/components/schemas/SetupRequest"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"security": [
|
|
220
|
+
{
|
|
221
|
+
"apiKeyAuth": []
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"jwtAuthWithLastLogin": []
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
"responses": {
|
|
228
|
+
"200": {
|
|
229
|
+
"content": {
|
|
230
|
+
"application/json": {
|
|
231
|
+
"schema": {
|
|
232
|
+
"$ref": "#/components/schemas/SetupResponse"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"description": ""
|
|
237
|
+
},
|
|
238
|
+
"400": {
|
|
239
|
+
"content": {
|
|
240
|
+
"application/json": {
|
|
241
|
+
"schema": {
|
|
242
|
+
"description": "2FA already enabled or invalid request"
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"description": ""
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"x-async-capable": false
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"/cfg/totp/setup/confirm/": {
|
|
253
|
+
"post": {
|
|
254
|
+
"operationId": "cfg_totp_setup_confirm_create",
|
|
255
|
+
"description": "Confirm 2FA setup with first valid code.\n\nActivates the device and generates backup codes.",
|
|
256
|
+
"tags": [
|
|
257
|
+
"cfg_totp_setup"
|
|
258
|
+
],
|
|
259
|
+
"requestBody": {
|
|
260
|
+
"content": {
|
|
261
|
+
"application/json": {
|
|
262
|
+
"schema": {
|
|
263
|
+
"$ref": "#/components/schemas/ConfirmSetupRequest"
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"required": true
|
|
268
|
+
},
|
|
269
|
+
"security": [
|
|
270
|
+
{
|
|
271
|
+
"apiKeyAuth": []
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"jwtAuthWithLastLogin": []
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
"responses": {
|
|
278
|
+
"200": {
|
|
279
|
+
"content": {
|
|
280
|
+
"application/json": {
|
|
281
|
+
"schema": {
|
|
282
|
+
"$ref": "#/components/schemas/ConfirmSetupResponse"
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"description": ""
|
|
287
|
+
},
|
|
288
|
+
"400": {
|
|
289
|
+
"content": {
|
|
290
|
+
"application/json": {
|
|
291
|
+
"schema": {
|
|
292
|
+
"description": "Invalid code or setup expired"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
"description": ""
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
"x-async-capable": false
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"/cfg/totp/verify/": {
|
|
303
|
+
"post": {
|
|
304
|
+
"operationId": "cfg_totp_verify_create",
|
|
305
|
+
"description": "Verify TOTP code for 2FA session.\n\nCompletes authentication and returns JWT tokens on success.",
|
|
306
|
+
"tags": [
|
|
307
|
+
"cfg_totp_verify"
|
|
308
|
+
],
|
|
309
|
+
"requestBody": {
|
|
310
|
+
"content": {
|
|
311
|
+
"application/json": {
|
|
312
|
+
"schema": {
|
|
313
|
+
"$ref": "#/components/schemas/VerifyRequest"
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"required": true
|
|
318
|
+
},
|
|
319
|
+
"security": [
|
|
320
|
+
{
|
|
321
|
+
"apiKeyAuth": []
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"jwtAuthWithLastLogin": []
|
|
325
|
+
},
|
|
326
|
+
{}
|
|
327
|
+
],
|
|
328
|
+
"responses": {
|
|
329
|
+
"200": {
|
|
330
|
+
"content": {
|
|
331
|
+
"application/json": {
|
|
332
|
+
"schema": {
|
|
333
|
+
"$ref": "#/components/schemas/VerifyResponse"
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"description": ""
|
|
338
|
+
},
|
|
339
|
+
"400": {
|
|
340
|
+
"content": {
|
|
341
|
+
"application/json": {
|
|
342
|
+
"schema": {
|
|
343
|
+
"description": "Invalid code or session"
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
"description": ""
|
|
348
|
+
},
|
|
349
|
+
"403": {
|
|
350
|
+
"content": {
|
|
351
|
+
"application/json": {
|
|
352
|
+
"schema": {
|
|
353
|
+
"description": "Too many attempts"
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"description": ""
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"x-async-capable": false
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
"/cfg/totp/verify/backup/": {
|
|
364
|
+
"post": {
|
|
365
|
+
"operationId": "cfg_totp_verify_backup_create",
|
|
366
|
+
"description": "Verify backup recovery code for 2FA session.\n\nAlternative verification method when TOTP device unavailable.",
|
|
367
|
+
"tags": [
|
|
368
|
+
"cfg_totp_verify"
|
|
369
|
+
],
|
|
370
|
+
"requestBody": {
|
|
371
|
+
"content": {
|
|
372
|
+
"application/json": {
|
|
373
|
+
"schema": {
|
|
374
|
+
"$ref": "#/components/schemas/VerifyBackupRequest"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"required": true
|
|
379
|
+
},
|
|
380
|
+
"security": [
|
|
381
|
+
{
|
|
382
|
+
"apiKeyAuth": []
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
"jwtAuthWithLastLogin": []
|
|
386
|
+
},
|
|
387
|
+
{}
|
|
388
|
+
],
|
|
389
|
+
"responses": {
|
|
390
|
+
"200": {
|
|
391
|
+
"content": {
|
|
392
|
+
"application/json": {
|
|
393
|
+
"schema": {
|
|
394
|
+
"$ref": "#/components/schemas/VerifyResponse"
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
"description": ""
|
|
399
|
+
},
|
|
400
|
+
"400": {
|
|
401
|
+
"content": {
|
|
402
|
+
"application/json": {
|
|
403
|
+
"schema": {
|
|
404
|
+
"description": "Invalid backup code or session"
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"description": ""
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
"x-async-capable": false
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
"components": {
|
|
416
|
+
"schemas": {
|
|
417
|
+
"BackupCodesRegenerateRequest": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"description": "Serializer for regenerating backup codes.",
|
|
420
|
+
"properties": {
|
|
421
|
+
"code": {
|
|
422
|
+
"type": "string",
|
|
423
|
+
"minLength": 6,
|
|
424
|
+
"description": "TOTP code for verification",
|
|
425
|
+
"maxLength": 6
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
"required": [
|
|
429
|
+
"code"
|
|
430
|
+
]
|
|
431
|
+
},
|
|
432
|
+
"BackupCodesRegenerateResponse": {
|
|
433
|
+
"type": "object",
|
|
434
|
+
"description": "Response serializer for backup codes regeneration.",
|
|
435
|
+
"properties": {
|
|
436
|
+
"backup_codes": {
|
|
437
|
+
"type": "array",
|
|
438
|
+
"items": {
|
|
439
|
+
"type": "string"
|
|
440
|
+
},
|
|
441
|
+
"description": "List of new backup codes (save these!)"
|
|
442
|
+
},
|
|
443
|
+
"warning": {
|
|
444
|
+
"type": "string",
|
|
445
|
+
"description": "Warning about previous codes being invalidated"
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"required": [
|
|
449
|
+
"backup_codes",
|
|
450
|
+
"warning"
|
|
451
|
+
]
|
|
452
|
+
},
|
|
453
|
+
"BackupCodesStatus": {
|
|
454
|
+
"type": "object",
|
|
455
|
+
"description": "Serializer for backup codes status.",
|
|
456
|
+
"properties": {
|
|
457
|
+
"remaining_count": {
|
|
458
|
+
"type": "integer",
|
|
459
|
+
"description": "Number of unused backup codes"
|
|
460
|
+
},
|
|
461
|
+
"total_generated": {
|
|
462
|
+
"type": "integer",
|
|
463
|
+
"description": "Total number of codes generated"
|
|
464
|
+
},
|
|
465
|
+
"warning": {
|
|
466
|
+
"type": [
|
|
467
|
+
"string",
|
|
468
|
+
"null"
|
|
469
|
+
],
|
|
470
|
+
"description": "Warning if running low on codes"
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"required": [
|
|
474
|
+
"remaining_count",
|
|
475
|
+
"total_generated"
|
|
476
|
+
]
|
|
477
|
+
},
|
|
478
|
+
"ConfirmSetupRequest": {
|
|
479
|
+
"type": "object",
|
|
480
|
+
"description": "Serializer for confirming 2FA setup with first code.",
|
|
481
|
+
"properties": {
|
|
482
|
+
"device_id": {
|
|
483
|
+
"type": "string",
|
|
484
|
+
"format": "uuid",
|
|
485
|
+
"description": "Device ID from setup response"
|
|
486
|
+
},
|
|
487
|
+
"code": {
|
|
488
|
+
"type": "string",
|
|
489
|
+
"minLength": 6,
|
|
490
|
+
"description": "6-digit TOTP code from authenticator app",
|
|
491
|
+
"maxLength": 6
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"required": [
|
|
495
|
+
"code",
|
|
496
|
+
"device_id"
|
|
497
|
+
]
|
|
498
|
+
},
|
|
499
|
+
"ConfirmSetupResponse": {
|
|
500
|
+
"type": "object",
|
|
501
|
+
"description": "Response serializer for setup confirmation.",
|
|
502
|
+
"properties": {
|
|
503
|
+
"message": {
|
|
504
|
+
"type": "string"
|
|
505
|
+
},
|
|
506
|
+
"backup_codes": {
|
|
507
|
+
"type": "array",
|
|
508
|
+
"items": {
|
|
509
|
+
"type": "string"
|
|
510
|
+
},
|
|
511
|
+
"description": "List of backup recovery codes (save these!)"
|
|
512
|
+
},
|
|
513
|
+
"backup_codes_warning": {
|
|
514
|
+
"type": "string",
|
|
515
|
+
"description": "Warning message about backup codes"
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
"required": [
|
|
519
|
+
"backup_codes",
|
|
520
|
+
"backup_codes_warning",
|
|
521
|
+
"message"
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
"DeviceList": {
|
|
525
|
+
"type": "object",
|
|
526
|
+
"description": "Serializer for listing TOTP devices.",
|
|
527
|
+
"properties": {
|
|
528
|
+
"id": {
|
|
529
|
+
"type": "string",
|
|
530
|
+
"format": "uuid",
|
|
531
|
+
"readOnly": true
|
|
532
|
+
},
|
|
533
|
+
"name": {
|
|
534
|
+
"type": "string",
|
|
535
|
+
"readOnly": true,
|
|
536
|
+
"description": "Device name for identification"
|
|
537
|
+
},
|
|
538
|
+
"is_primary": {
|
|
539
|
+
"type": "boolean",
|
|
540
|
+
"readOnly": true,
|
|
541
|
+
"description": "Primary device used for verification"
|
|
542
|
+
},
|
|
543
|
+
"status": {
|
|
544
|
+
"allOf": [
|
|
545
|
+
{
|
|
546
|
+
"$ref": "#/components/schemas/DeviceStatusEnum"
|
|
547
|
+
}
|
|
548
|
+
],
|
|
549
|
+
"readOnly": true
|
|
550
|
+
},
|
|
551
|
+
"created_at": {
|
|
552
|
+
"type": "string",
|
|
553
|
+
"format": "date-time",
|
|
554
|
+
"readOnly": true
|
|
555
|
+
},
|
|
556
|
+
"confirmed_at": {
|
|
557
|
+
"type": [
|
|
558
|
+
"string",
|
|
559
|
+
"null"
|
|
560
|
+
],
|
|
561
|
+
"format": "date-time",
|
|
562
|
+
"readOnly": true,
|
|
563
|
+
"description": "When device setup was confirmed"
|
|
564
|
+
},
|
|
565
|
+
"last_used_at": {
|
|
566
|
+
"type": [
|
|
567
|
+
"string",
|
|
568
|
+
"null"
|
|
569
|
+
],
|
|
570
|
+
"format": "date-time",
|
|
571
|
+
"readOnly": true,
|
|
572
|
+
"description": "Last successful verification"
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
"required": [
|
|
576
|
+
"confirmed_at",
|
|
577
|
+
"created_at",
|
|
578
|
+
"id",
|
|
579
|
+
"is_primary",
|
|
580
|
+
"last_used_at",
|
|
581
|
+
"name",
|
|
582
|
+
"status"
|
|
583
|
+
]
|
|
584
|
+
},
|
|
585
|
+
"DeviceListResponse": {
|
|
586
|
+
"type": "object",
|
|
587
|
+
"description": "Response serializer for device list endpoint.",
|
|
588
|
+
"properties": {
|
|
589
|
+
"devices": {
|
|
590
|
+
"type": "array",
|
|
591
|
+
"items": {
|
|
592
|
+
"$ref": "#/components/schemas/DeviceList"
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
"has_2fa_enabled": {
|
|
596
|
+
"type": "boolean"
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
"required": [
|
|
600
|
+
"devices",
|
|
601
|
+
"has_2fa_enabled"
|
|
602
|
+
]
|
|
603
|
+
},
|
|
604
|
+
"DeviceStatusEnum": {
|
|
605
|
+
"enum": [
|
|
606
|
+
"pending",
|
|
607
|
+
"active",
|
|
608
|
+
"disabled"
|
|
609
|
+
],
|
|
610
|
+
"type": "string",
|
|
611
|
+
"description": "* `pending` - Pending Confirmation\n* `active` - Active\n* `disabled` - Disabled"
|
|
612
|
+
},
|
|
613
|
+
"DisableRequest": {
|
|
614
|
+
"type": "object",
|
|
615
|
+
"description": "Serializer for completely disabling 2FA.",
|
|
616
|
+
"properties": {
|
|
617
|
+
"code": {
|
|
618
|
+
"type": "string",
|
|
619
|
+
"minLength": 6,
|
|
620
|
+
"description": "TOTP code for verification",
|
|
621
|
+
"maxLength": 6
|
|
622
|
+
}
|
|
623
|
+
},
|
|
624
|
+
"required": [
|
|
625
|
+
"code"
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
"SetupRequest": {
|
|
629
|
+
"type": "object",
|
|
630
|
+
"description": "Serializer for starting 2FA setup.",
|
|
631
|
+
"properties": {
|
|
632
|
+
"device_name": {
|
|
633
|
+
"type": "string",
|
|
634
|
+
"minLength": 1,
|
|
635
|
+
"default": "Authenticator",
|
|
636
|
+
"description": "Device name for identification (e.g., 'My iPhone')",
|
|
637
|
+
"maxLength": 100
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
},
|
|
641
|
+
"SetupResponse": {
|
|
642
|
+
"type": "object",
|
|
643
|
+
"description": "Response serializer for setup initiation.",
|
|
644
|
+
"properties": {
|
|
645
|
+
"device_id": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"format": "uuid",
|
|
648
|
+
"description": "Device ID to use for confirmation"
|
|
649
|
+
},
|
|
650
|
+
"secret": {
|
|
651
|
+
"type": "string",
|
|
652
|
+
"description": "Base32-encoded TOTP secret (for manual entry)"
|
|
653
|
+
},
|
|
654
|
+
"provisioning_uri": {
|
|
655
|
+
"type": "string",
|
|
656
|
+
"description": "otpauth:// URI for QR code generation"
|
|
657
|
+
},
|
|
658
|
+
"qr_code_base64": {
|
|
659
|
+
"type": "string",
|
|
660
|
+
"description": "Base64-encoded QR code image (data URI)"
|
|
661
|
+
},
|
|
662
|
+
"expires_in": {
|
|
663
|
+
"type": "integer",
|
|
664
|
+
"description": "Seconds until setup expires (typically 600 = 10 minutes)"
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
"required": [
|
|
668
|
+
"device_id",
|
|
669
|
+
"expires_in",
|
|
670
|
+
"provisioning_uri",
|
|
671
|
+
"qr_code_base64",
|
|
672
|
+
"secret"
|
|
673
|
+
]
|
|
674
|
+
},
|
|
675
|
+
"TotpVerifyUser": {
|
|
676
|
+
"type": "object",
|
|
677
|
+
"description": "User data returned after 2FA verification.",
|
|
678
|
+
"properties": {
|
|
679
|
+
"id": {
|
|
680
|
+
"type": "integer",
|
|
681
|
+
"readOnly": true
|
|
682
|
+
},
|
|
683
|
+
"email": {
|
|
684
|
+
"type": "string",
|
|
685
|
+
"format": "email",
|
|
686
|
+
"readOnly": true
|
|
687
|
+
},
|
|
688
|
+
"first_name": {
|
|
689
|
+
"type": [
|
|
690
|
+
"string",
|
|
691
|
+
"null"
|
|
692
|
+
],
|
|
693
|
+
"maxLength": 50
|
|
694
|
+
},
|
|
695
|
+
"last_name": {
|
|
696
|
+
"type": [
|
|
697
|
+
"string",
|
|
698
|
+
"null"
|
|
699
|
+
],
|
|
700
|
+
"maxLength": 50
|
|
701
|
+
},
|
|
702
|
+
"full_name": {
|
|
703
|
+
"type": "string",
|
|
704
|
+
"description": "Get user's full name.",
|
|
705
|
+
"readOnly": true
|
|
706
|
+
},
|
|
707
|
+
"initials": {
|
|
708
|
+
"type": "string",
|
|
709
|
+
"description": "Get user's initials for avatar fallback.",
|
|
710
|
+
"readOnly": true
|
|
711
|
+
},
|
|
712
|
+
"display_username": {
|
|
713
|
+
"type": "string",
|
|
714
|
+
"description": "Get formatted username for display.",
|
|
715
|
+
"readOnly": true
|
|
716
|
+
},
|
|
717
|
+
"company": {
|
|
718
|
+
"type": [
|
|
719
|
+
"string",
|
|
720
|
+
"null"
|
|
721
|
+
],
|
|
722
|
+
"maxLength": 100
|
|
723
|
+
},
|
|
724
|
+
"phone": {
|
|
725
|
+
"type": [
|
|
726
|
+
"string",
|
|
727
|
+
"null"
|
|
728
|
+
],
|
|
729
|
+
"maxLength": 20
|
|
730
|
+
},
|
|
731
|
+
"position": {
|
|
732
|
+
"type": [
|
|
733
|
+
"string",
|
|
734
|
+
"null"
|
|
735
|
+
],
|
|
736
|
+
"maxLength": 100
|
|
737
|
+
},
|
|
738
|
+
"language": {
|
|
739
|
+
"type": [
|
|
740
|
+
"string",
|
|
741
|
+
"null"
|
|
742
|
+
],
|
|
743
|
+
"maxLength": 10
|
|
744
|
+
},
|
|
745
|
+
"timezone": {
|
|
746
|
+
"type": [
|
|
747
|
+
"string",
|
|
748
|
+
"null"
|
|
749
|
+
],
|
|
750
|
+
"maxLength": 64
|
|
751
|
+
},
|
|
752
|
+
"avatar": {
|
|
753
|
+
"type": [
|
|
754
|
+
"string",
|
|
755
|
+
"null"
|
|
756
|
+
],
|
|
757
|
+
"format": "uri",
|
|
758
|
+
"readOnly": true
|
|
759
|
+
},
|
|
760
|
+
"is_staff": {
|
|
761
|
+
"type": "boolean",
|
|
762
|
+
"readOnly": true,
|
|
763
|
+
"title": "Staff status",
|
|
764
|
+
"description": "Designates whether the user can log into this admin site."
|
|
765
|
+
},
|
|
766
|
+
"is_superuser": {
|
|
767
|
+
"type": "boolean",
|
|
768
|
+
"readOnly": true,
|
|
769
|
+
"title": "Superuser status",
|
|
770
|
+
"description": "Designates that this user has all permissions without explicitly assigning them."
|
|
771
|
+
},
|
|
772
|
+
"date_joined": {
|
|
773
|
+
"type": "string",
|
|
774
|
+
"format": "date-time",
|
|
775
|
+
"readOnly": true
|
|
776
|
+
},
|
|
777
|
+
"last_login": {
|
|
778
|
+
"type": [
|
|
779
|
+
"string",
|
|
780
|
+
"null"
|
|
781
|
+
],
|
|
782
|
+
"format": "date-time",
|
|
783
|
+
"readOnly": true
|
|
784
|
+
},
|
|
785
|
+
"unanswered_messages_count": {
|
|
786
|
+
"type": "integer",
|
|
787
|
+
"readOnly": true,
|
|
788
|
+
"default": 0
|
|
789
|
+
},
|
|
790
|
+
"api_key": {
|
|
791
|
+
"type": [
|
|
792
|
+
"string",
|
|
793
|
+
"null"
|
|
794
|
+
],
|
|
795
|
+
"readOnly": true
|
|
796
|
+
}
|
|
797
|
+
},
|
|
798
|
+
"required": [
|
|
799
|
+
"api_key",
|
|
800
|
+
"avatar",
|
|
801
|
+
"date_joined",
|
|
802
|
+
"display_username",
|
|
803
|
+
"email",
|
|
804
|
+
"full_name",
|
|
805
|
+
"id",
|
|
806
|
+
"initials",
|
|
807
|
+
"is_staff",
|
|
808
|
+
"is_superuser",
|
|
809
|
+
"last_login",
|
|
810
|
+
"unanswered_messages_count"
|
|
811
|
+
]
|
|
812
|
+
},
|
|
813
|
+
"VerifyBackupRequest": {
|
|
814
|
+
"type": "object",
|
|
815
|
+
"description": "Serializer for backup code verification during login.",
|
|
816
|
+
"properties": {
|
|
817
|
+
"session_id": {
|
|
818
|
+
"type": "string",
|
|
819
|
+
"format": "uuid",
|
|
820
|
+
"description": "2FA session ID from login response"
|
|
821
|
+
},
|
|
822
|
+
"backup_code": {
|
|
823
|
+
"type": "string",
|
|
824
|
+
"minLength": 8,
|
|
825
|
+
"description": "8-character backup recovery code",
|
|
826
|
+
"maxLength": 8
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
"required": [
|
|
830
|
+
"backup_code",
|
|
831
|
+
"session_id"
|
|
832
|
+
]
|
|
833
|
+
},
|
|
834
|
+
"VerifyRequest": {
|
|
835
|
+
"type": "object",
|
|
836
|
+
"description": "Serializer for TOTP code verification during login.",
|
|
837
|
+
"properties": {
|
|
838
|
+
"session_id": {
|
|
839
|
+
"type": "string",
|
|
840
|
+
"format": "uuid",
|
|
841
|
+
"description": "2FA session ID from login response"
|
|
842
|
+
},
|
|
843
|
+
"code": {
|
|
844
|
+
"type": "string",
|
|
845
|
+
"minLength": 6,
|
|
846
|
+
"description": "6-digit TOTP code from authenticator app",
|
|
847
|
+
"maxLength": 6
|
|
848
|
+
}
|
|
849
|
+
},
|
|
850
|
+
"required": [
|
|
851
|
+
"code",
|
|
852
|
+
"session_id"
|
|
853
|
+
]
|
|
854
|
+
},
|
|
855
|
+
"VerifyResponse": {
|
|
856
|
+
"type": "object",
|
|
857
|
+
"description": "Response serializer for successful 2FA verification.",
|
|
858
|
+
"properties": {
|
|
859
|
+
"message": {
|
|
860
|
+
"type": "string"
|
|
861
|
+
},
|
|
862
|
+
"access_token": {
|
|
863
|
+
"type": "string",
|
|
864
|
+
"description": "JWT access token"
|
|
865
|
+
},
|
|
866
|
+
"refresh_token": {
|
|
867
|
+
"type": "string",
|
|
868
|
+
"description": "JWT refresh token"
|
|
869
|
+
},
|
|
870
|
+
"user": {
|
|
871
|
+
"allOf": [
|
|
872
|
+
{
|
|
873
|
+
"$ref": "#/components/schemas/TotpVerifyUser"
|
|
874
|
+
}
|
|
875
|
+
],
|
|
876
|
+
"description": "User profile data"
|
|
877
|
+
},
|
|
878
|
+
"remaining_backup_codes": {
|
|
879
|
+
"type": "integer",
|
|
880
|
+
"description": "Number of remaining backup codes (if backup code was used)"
|
|
881
|
+
},
|
|
882
|
+
"warning": {
|
|
883
|
+
"type": "string",
|
|
884
|
+
"description": "Warning message (e.g., low backup codes)"
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
"required": [
|
|
888
|
+
"access_token",
|
|
889
|
+
"message",
|
|
890
|
+
"refresh_token",
|
|
891
|
+
"user"
|
|
892
|
+
]
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
"securitySchemes": {
|
|
896
|
+
"apiKeyAuth": {
|
|
897
|
+
"type": "apiKey",
|
|
898
|
+
"in": "header",
|
|
899
|
+
"name": "X-API-Key"
|
|
900
|
+
},
|
|
901
|
+
"basicAuth": {
|
|
902
|
+
"type": "http",
|
|
903
|
+
"scheme": "basic"
|
|
904
|
+
},
|
|
905
|
+
"cookieAuth": {
|
|
906
|
+
"type": "apiKey",
|
|
907
|
+
"in": "cookie",
|
|
908
|
+
"name": "sessionid"
|
|
909
|
+
},
|
|
910
|
+
"jwtAuth": {
|
|
911
|
+
"type": "http",
|
|
912
|
+
"scheme": "bearer",
|
|
913
|
+
"bearerFormat": "JWT"
|
|
914
|
+
},
|
|
915
|
+
"jwtAuthWithLastLogin": {
|
|
916
|
+
"type": "http",
|
|
917
|
+
"scheme": "bearer",
|
|
918
|
+
"bearerFormat": "JWT"
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
},
|
|
922
|
+
"servers": [
|
|
923
|
+
{
|
|
924
|
+
"url": "http://localhost:8000"
|
|
925
|
+
}
|
|
926
|
+
]
|
|
927
|
+
}
|