square-authentication 10.0.1__tar.gz → 10.0.2__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.
- {square_authentication-10.0.1 → square_authentication-10.0.2}/PKG-INFO +7 -2
- {square_authentication-10.0.1 → square_authentication-10.0.2}/README.md +6 -1
- {square_authentication-10.0.1 → square_authentication-10.0.2}/setup.py +1 -1
- square_authentication-10.0.2/square_authentication/routes/core.py +494 -0
- square_authentication-10.0.2/square_authentication/routes/profile.py +126 -0
- square_authentication-10.0.2/square_authentication/routes/utility.py +31 -0
- square_authentication-10.0.2/square_authentication/utils/routes/__init__.py +0 -0
- {square_authentication-10.0.1/square_authentication → square_authentication-10.0.2/square_authentication/utils}/routes/core.py +33 -123
- {square_authentication-10.0.1/square_authentication → square_authentication-10.0.2/square_authentication/utils}/routes/profile.py +15 -35
- {square_authentication-10.0.1/square_authentication → square_authentication-10.0.2/square_authentication/utils}/routes/utility.py +2 -8
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication.egg-info/PKG-INFO +7 -2
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication.egg-info/SOURCES.txt +4 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/LICENSE +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/pyproject.toml +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/setup.cfg +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/__init__.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/configuration.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/data/config.sample.ini +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/data/config.testing.sample.ini +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/main.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/messages.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/pydantic_models/__init__.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/pydantic_models/core.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/pydantic_models/profile.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/routes/__init__.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/__init__.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/core.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/encryption.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/token.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication.egg-info/dependency_links.txt +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication.egg-info/requires.txt +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication.egg-info/top_level.txt +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_1.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_authentication.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_delete_user.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_email_verification.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_login.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_profile_management.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_token_management.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_update_profile.py +0 -0
- {square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_username.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: square_authentication
|
3
|
-
Version: 10.0.
|
3
|
+
Version: 10.0.2
|
4
4
|
Summary: authentication layer for my personal server.
|
5
5
|
Home-page: https://github.com/thepmsquare/square_authentication
|
6
6
|
Author: Parth Mukesh Mangtani
|
@@ -54,7 +54,12 @@ authentication layer for my personal server.
|
|
54
54
|
|
55
55
|
## goals
|
56
56
|
|
57
|
-
|
57
|
+
- integration with square_*
|
58
|
+
- unified authentication api across all projects
|
59
|
+
- jwt token support
|
60
|
+
- simple user and user profile management
|
61
|
+
- oauth support
|
62
|
+
- future extensibility
|
58
63
|
|
59
64
|
## Installation
|
60
65
|
|
@@ -8,7 +8,12 @@ authentication layer for my personal server.
|
|
8
8
|
|
9
9
|
## goals
|
10
10
|
|
11
|
-
|
11
|
+
- integration with square_*
|
12
|
+
- unified authentication api across all projects
|
13
|
+
- jwt token support
|
14
|
+
- simple user and user profile management
|
15
|
+
- oauth support
|
16
|
+
- future extensibility
|
12
17
|
|
13
18
|
## Installation
|
14
19
|
|
@@ -0,0 +1,494 @@
|
|
1
|
+
from typing import Annotated, List
|
2
|
+
|
3
|
+
from fastapi import APIRouter, Header, HTTPException, status
|
4
|
+
from fastapi.params import Query
|
5
|
+
from fastapi.responses import JSONResponse
|
6
|
+
from square_commons import get_api_output_in_standard_format
|
7
|
+
from square_database_structure.square.authentication.enums import (
|
8
|
+
RecoveryMethodEnum,
|
9
|
+
)
|
10
|
+
|
11
|
+
from square_authentication.configuration import (
|
12
|
+
global_object_square_logger,
|
13
|
+
)
|
14
|
+
from square_authentication.messages import messages
|
15
|
+
from square_authentication.pydantic_models.core import (
|
16
|
+
DeleteUserV0,
|
17
|
+
LoginUsernameV0,
|
18
|
+
LogoutAppsV0,
|
19
|
+
RegisterUsernameV0,
|
20
|
+
TokenType,
|
21
|
+
UpdatePasswordV0,
|
22
|
+
ResetPasswordAndLoginUsingBackupCodeV0,
|
23
|
+
SendResetPasswordEmailV0,
|
24
|
+
ResetPasswordAndLoginUsingResetEmailCodeV0,
|
25
|
+
RegisterLoginGoogleV0,
|
26
|
+
)
|
27
|
+
from square_authentication.utils.routes.core import (
|
28
|
+
util_register_username_v0,
|
29
|
+
util_register_login_google_v0,
|
30
|
+
util_get_user_details_v0,
|
31
|
+
util_update_user_app_ids_v0,
|
32
|
+
util_login_username_v0,
|
33
|
+
util_generate_access_token_v0,
|
34
|
+
util_logout_v0,
|
35
|
+
util_logout_apps_v0,
|
36
|
+
util_logout_all_v0,
|
37
|
+
util_update_username_v0,
|
38
|
+
util_delete_user_v0,
|
39
|
+
util_update_password_v0,
|
40
|
+
util_validate_and_get_payload_from_token_v0,
|
41
|
+
util_update_user_recovery_methods_v0,
|
42
|
+
util_generate_account_backup_codes_v0,
|
43
|
+
util_reset_password_and_login_using_backup_code_v0,
|
44
|
+
util_send_reset_password_email_v0,
|
45
|
+
util_reset_password_and_login_using_reset_email_code_v0,
|
46
|
+
)
|
47
|
+
|
48
|
+
router = APIRouter(
|
49
|
+
tags=["core"],
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
@router.post("/register_username/v0")
|
54
|
+
@global_object_square_logger.auto_logger()
|
55
|
+
async def register_username_v0(
|
56
|
+
body: RegisterUsernameV0,
|
57
|
+
):
|
58
|
+
try:
|
59
|
+
return util_register_username_v0(
|
60
|
+
username=body.username,
|
61
|
+
password=body.password,
|
62
|
+
app_id=body.app_id,
|
63
|
+
)
|
64
|
+
except HTTPException as he:
|
65
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
66
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
67
|
+
except Exception as e:
|
68
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
69
|
+
output_content = get_api_output_in_standard_format(
|
70
|
+
message=messages["GENERIC_500"], log=str(e)
|
71
|
+
)
|
72
|
+
return JSONResponse(
|
73
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
74
|
+
)
|
75
|
+
|
76
|
+
|
77
|
+
@router.post("/register_login_google/v0")
|
78
|
+
async def register_login_google_v0(body: RegisterLoginGoogleV0):
|
79
|
+
try:
|
80
|
+
return util_register_login_google_v0(
|
81
|
+
app_id=body.app_id,
|
82
|
+
google_id=body.google_id,
|
83
|
+
assign_app_id_if_missing=body.assign_app_id_if_missing,
|
84
|
+
)
|
85
|
+
except HTTPException as he:
|
86
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
87
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
88
|
+
except Exception as e:
|
89
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
90
|
+
output_content = get_api_output_in_standard_format(
|
91
|
+
message=messages["GENERIC_500"], log=str(e)
|
92
|
+
)
|
93
|
+
return JSONResponse(
|
94
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
@router.get("/get_user_details/v0")
|
99
|
+
@global_object_square_logger.auto_logger()
|
100
|
+
async def get_user_details_v0(
|
101
|
+
access_token: Annotated[str, Header()],
|
102
|
+
):
|
103
|
+
try:
|
104
|
+
return util_get_user_details_v0(access_token=access_token)
|
105
|
+
except HTTPException as he:
|
106
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
107
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
108
|
+
except Exception as e:
|
109
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
110
|
+
output_content = get_api_output_in_standard_format(
|
111
|
+
message=messages["GENERIC_500"], log=str(e)
|
112
|
+
)
|
113
|
+
return JSONResponse(
|
114
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
115
|
+
)
|
116
|
+
|
117
|
+
|
118
|
+
@router.patch("/update_user_app_ids/v0")
|
119
|
+
@global_object_square_logger.auto_logger()
|
120
|
+
async def update_user_app_ids_v0(
|
121
|
+
access_token: Annotated[str, Header()],
|
122
|
+
app_ids_to_add: List[int],
|
123
|
+
app_ids_to_remove: List[int],
|
124
|
+
):
|
125
|
+
try:
|
126
|
+
return util_update_user_app_ids_v0(
|
127
|
+
access_token=access_token,
|
128
|
+
app_ids_to_add=app_ids_to_add,
|
129
|
+
app_ids_to_remove=app_ids_to_remove,
|
130
|
+
)
|
131
|
+
except HTTPException as he:
|
132
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
133
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
134
|
+
except Exception as e:
|
135
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
136
|
+
output_content = get_api_output_in_standard_format(
|
137
|
+
message=messages["GENERIC_500"], log=str(e)
|
138
|
+
)
|
139
|
+
return JSONResponse(
|
140
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
141
|
+
)
|
142
|
+
|
143
|
+
|
144
|
+
@router.post("/login_username/v0")
|
145
|
+
@global_object_square_logger.auto_logger()
|
146
|
+
async def login_username_v0(body: LoginUsernameV0):
|
147
|
+
username = body.username
|
148
|
+
password = body.password
|
149
|
+
app_id = body.app_id
|
150
|
+
assign_app_id_if_missing = body.assign_app_id_if_missing
|
151
|
+
username = username.lower()
|
152
|
+
try:
|
153
|
+
return util_login_username_v0(
|
154
|
+
username=username,
|
155
|
+
password=password,
|
156
|
+
app_id=app_id,
|
157
|
+
assign_app_id_if_missing=assign_app_id_if_missing,
|
158
|
+
)
|
159
|
+
except HTTPException as he:
|
160
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
161
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
162
|
+
except Exception as e:
|
163
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
164
|
+
output_content = get_api_output_in_standard_format(
|
165
|
+
message=messages["GENERIC_500"], log=str(e)
|
166
|
+
)
|
167
|
+
return JSONResponse(
|
168
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
169
|
+
)
|
170
|
+
|
171
|
+
|
172
|
+
@router.get("/generate_access_token/v0")
|
173
|
+
@global_object_square_logger.auto_logger()
|
174
|
+
async def generate_access_token_v0(
|
175
|
+
refresh_token: Annotated[str, Header()],
|
176
|
+
):
|
177
|
+
try:
|
178
|
+
return util_generate_access_token_v0(
|
179
|
+
refresh_token=refresh_token,
|
180
|
+
)
|
181
|
+
except HTTPException as he:
|
182
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
183
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
184
|
+
except Exception as e:
|
185
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
186
|
+
output_content = get_api_output_in_standard_format(
|
187
|
+
message=messages["GENERIC_500"], log=str(e)
|
188
|
+
)
|
189
|
+
return JSONResponse(
|
190
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
191
|
+
)
|
192
|
+
|
193
|
+
|
194
|
+
@router.delete("/logout/v0")
|
195
|
+
@global_object_square_logger.auto_logger()
|
196
|
+
async def logout_v0(
|
197
|
+
refresh_token: Annotated[str, Header()],
|
198
|
+
):
|
199
|
+
try:
|
200
|
+
return util_logout_v0(
|
201
|
+
refresh_token=refresh_token,
|
202
|
+
)
|
203
|
+
except HTTPException as he:
|
204
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
205
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
206
|
+
except Exception as e:
|
207
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
208
|
+
output_content = get_api_output_in_standard_format(
|
209
|
+
message=messages["GENERIC_500"], log=str(e)
|
210
|
+
)
|
211
|
+
return JSONResponse(
|
212
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
213
|
+
)
|
214
|
+
|
215
|
+
|
216
|
+
@router.post("/logout/apps/v0")
|
217
|
+
@global_object_square_logger.auto_logger()
|
218
|
+
async def logout_apps_v0(
|
219
|
+
access_token: Annotated[str, Header()],
|
220
|
+
body: LogoutAppsV0,
|
221
|
+
):
|
222
|
+
app_ids = body.app_ids
|
223
|
+
try:
|
224
|
+
return util_logout_apps_v0(access_token=access_token, app_ids=app_ids)
|
225
|
+
except HTTPException as he:
|
226
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
227
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
228
|
+
except Exception as e:
|
229
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
230
|
+
output_content = get_api_output_in_standard_format(
|
231
|
+
message=messages["GENERIC_500"], log=str(e)
|
232
|
+
)
|
233
|
+
return JSONResponse(
|
234
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
235
|
+
)
|
236
|
+
|
237
|
+
|
238
|
+
@router.delete("/logout/all/v0")
|
239
|
+
@global_object_square_logger.auto_logger()
|
240
|
+
async def logout_all_v0(
|
241
|
+
access_token: Annotated[str, Header()],
|
242
|
+
):
|
243
|
+
try:
|
244
|
+
return util_logout_all_v0(access_token=access_token)
|
245
|
+
except HTTPException as he:
|
246
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
247
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
248
|
+
except Exception as e:
|
249
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
250
|
+
output_content = get_api_output_in_standard_format(
|
251
|
+
message=messages["GENERIC_500"], log=str(e)
|
252
|
+
)
|
253
|
+
return JSONResponse(
|
254
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
255
|
+
)
|
256
|
+
|
257
|
+
|
258
|
+
@router.patch("/update_username/v0")
|
259
|
+
@global_object_square_logger.auto_logger()
|
260
|
+
async def update_username_v0(
|
261
|
+
new_username: str,
|
262
|
+
access_token: Annotated[str, Header()],
|
263
|
+
):
|
264
|
+
try:
|
265
|
+
return util_update_username_v0(
|
266
|
+
new_username=new_username, access_token=access_token
|
267
|
+
)
|
268
|
+
|
269
|
+
except HTTPException as he:
|
270
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
271
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
272
|
+
except Exception as e:
|
273
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
274
|
+
output_content = get_api_output_in_standard_format(
|
275
|
+
message=messages["GENERIC_500"], log=str(e)
|
276
|
+
)
|
277
|
+
return JSONResponse(
|
278
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
279
|
+
)
|
280
|
+
|
281
|
+
|
282
|
+
@router.post("/delete_user/v0")
|
283
|
+
@global_object_square_logger.auto_logger()
|
284
|
+
async def delete_user_v0(
|
285
|
+
body: DeleteUserV0,
|
286
|
+
access_token: Annotated[str, Header()],
|
287
|
+
):
|
288
|
+
password = body.password
|
289
|
+
try:
|
290
|
+
return util_delete_user_v0(
|
291
|
+
password=password,
|
292
|
+
access_token=access_token,
|
293
|
+
)
|
294
|
+
except HTTPException as he:
|
295
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
296
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
297
|
+
except Exception as e:
|
298
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
299
|
+
output_content = get_api_output_in_standard_format(
|
300
|
+
message=messages["GENERIC_500"], log=str(e)
|
301
|
+
)
|
302
|
+
return JSONResponse(
|
303
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
304
|
+
)
|
305
|
+
|
306
|
+
|
307
|
+
@router.patch("/update_password/v0")
|
308
|
+
@global_object_square_logger.auto_logger()
|
309
|
+
async def update_password_v0(
|
310
|
+
body: UpdatePasswordV0,
|
311
|
+
access_token: Annotated[str, Header()],
|
312
|
+
):
|
313
|
+
old_password = body.old_password
|
314
|
+
new_password = body.new_password
|
315
|
+
logout_other_sessions = body.logout_other_sessions
|
316
|
+
preserve_session_refresh_token = body.preserve_session_refresh_token
|
317
|
+
try:
|
318
|
+
return util_update_password_v0(
|
319
|
+
old_password=old_password,
|
320
|
+
new_password=new_password,
|
321
|
+
logout_other_sessions=logout_other_sessions,
|
322
|
+
preserve_session_refresh_token=preserve_session_refresh_token,
|
323
|
+
access_token=access_token,
|
324
|
+
)
|
325
|
+
except HTTPException as he:
|
326
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
327
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
328
|
+
except Exception as e:
|
329
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
330
|
+
output_content = get_api_output_in_standard_format(
|
331
|
+
message=messages["GENERIC_500"], log=str(e)
|
332
|
+
)
|
333
|
+
return JSONResponse(
|
334
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
335
|
+
)
|
336
|
+
|
337
|
+
|
338
|
+
@router.get("/validate_and_get_payload_from_token/v0")
|
339
|
+
@global_object_square_logger.auto_logger()
|
340
|
+
async def validate_and_get_payload_from_token_v0(
|
341
|
+
app_id: int,
|
342
|
+
token: Annotated[str, Header()],
|
343
|
+
token_type: TokenType = Query(...),
|
344
|
+
):
|
345
|
+
try:
|
346
|
+
return util_validate_and_get_payload_from_token_v0(
|
347
|
+
app_id=app_id,
|
348
|
+
token=token,
|
349
|
+
token_type=token_type,
|
350
|
+
)
|
351
|
+
except HTTPException as he:
|
352
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
353
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
354
|
+
except Exception as e:
|
355
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
356
|
+
output_content = get_api_output_in_standard_format(
|
357
|
+
message=messages["GENERIC_500"], log=str(e)
|
358
|
+
)
|
359
|
+
return JSONResponse(
|
360
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
361
|
+
)
|
362
|
+
|
363
|
+
|
364
|
+
@router.patch("/update_user_recovery_methods/v0")
|
365
|
+
@global_object_square_logger.auto_logger()
|
366
|
+
async def update_user_recovery_methods_v0(
|
367
|
+
access_token: Annotated[str, Header()],
|
368
|
+
recovery_methods_to_add: List[RecoveryMethodEnum] = None,
|
369
|
+
recovery_methods_to_remove: List[RecoveryMethodEnum] = None,
|
370
|
+
):
|
371
|
+
try:
|
372
|
+
return util_update_user_recovery_methods_v0(
|
373
|
+
access_token=access_token,
|
374
|
+
recovery_methods_to_add=recovery_methods_to_add,
|
375
|
+
recovery_methods_to_remove=recovery_methods_to_remove,
|
376
|
+
)
|
377
|
+
except HTTPException as he:
|
378
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
379
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
380
|
+
except Exception as e:
|
381
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
382
|
+
output_content = get_api_output_in_standard_format(
|
383
|
+
message=messages["GENERIC_500"], log=str(e)
|
384
|
+
)
|
385
|
+
return JSONResponse(
|
386
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
387
|
+
)
|
388
|
+
|
389
|
+
|
390
|
+
@router.post("/generate_account_backup_codes/v0")
|
391
|
+
@global_object_square_logger.auto_logger()
|
392
|
+
async def generate_account_backup_codes_v0(
|
393
|
+
access_token: Annotated[str, Header()],
|
394
|
+
):
|
395
|
+
try:
|
396
|
+
return util_generate_account_backup_codes_v0(
|
397
|
+
access_token=access_token,
|
398
|
+
)
|
399
|
+
except HTTPException as he:
|
400
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
401
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
402
|
+
except Exception as e:
|
403
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
404
|
+
output_content = get_api_output_in_standard_format(
|
405
|
+
message=messages["GENERIC_500"], log=str(e)
|
406
|
+
)
|
407
|
+
return JSONResponse(
|
408
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
409
|
+
)
|
410
|
+
|
411
|
+
|
412
|
+
@router.post("/reset_password_and_login_using_backup_code/v0")
|
413
|
+
@global_object_square_logger.auto_logger()
|
414
|
+
async def reset_password_and_login_using_backup_code_v0(
|
415
|
+
body: ResetPasswordAndLoginUsingBackupCodeV0,
|
416
|
+
):
|
417
|
+
backup_code = body.backup_code
|
418
|
+
username = body.username
|
419
|
+
new_password = body.new_password
|
420
|
+
app_id = body.app_id
|
421
|
+
logout_other_sessions = body.logout_other_sessions
|
422
|
+
try:
|
423
|
+
return util_reset_password_and_login_using_backup_code_v0(
|
424
|
+
backup_code=backup_code,
|
425
|
+
username=username,
|
426
|
+
new_password=new_password,
|
427
|
+
app_id=app_id,
|
428
|
+
logout_other_sessions=logout_other_sessions,
|
429
|
+
)
|
430
|
+
except HTTPException as he:
|
431
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
432
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
433
|
+
except Exception as e:
|
434
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
435
|
+
output_content = get_api_output_in_standard_format(
|
436
|
+
message=messages["GENERIC_500"], log=str(e)
|
437
|
+
)
|
438
|
+
return JSONResponse(
|
439
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
440
|
+
)
|
441
|
+
|
442
|
+
|
443
|
+
@router.post("/send_reset_password_email/v0")
|
444
|
+
@global_object_square_logger.auto_logger()
|
445
|
+
async def send_reset_password_email_v0(
|
446
|
+
body: SendResetPasswordEmailV0,
|
447
|
+
):
|
448
|
+
username = body.username
|
449
|
+
try:
|
450
|
+
return util_send_reset_password_email_v0(
|
451
|
+
username=username,
|
452
|
+
)
|
453
|
+
except HTTPException as he:
|
454
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
455
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
456
|
+
except Exception as e:
|
457
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
458
|
+
output_content = get_api_output_in_standard_format(
|
459
|
+
message=messages["GENERIC_500"], log=str(e)
|
460
|
+
)
|
461
|
+
return JSONResponse(
|
462
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
463
|
+
)
|
464
|
+
|
465
|
+
|
466
|
+
@router.post("/reset_password_and_login_using_reset_email_code/v0")
|
467
|
+
@global_object_square_logger.auto_logger()
|
468
|
+
async def reset_password_and_login_using_reset_email_code_v0(
|
469
|
+
body: ResetPasswordAndLoginUsingResetEmailCodeV0,
|
470
|
+
):
|
471
|
+
reset_email_code = body.reset_email_code
|
472
|
+
username = body.username
|
473
|
+
new_password = body.new_password
|
474
|
+
app_id = body.app_id
|
475
|
+
logout_other_sessions = body.logout_other_sessions
|
476
|
+
try:
|
477
|
+
return util_reset_password_and_login_using_reset_email_code_v0(
|
478
|
+
reset_email_code=reset_email_code,
|
479
|
+
username=username,
|
480
|
+
new_password=new_password,
|
481
|
+
app_id=app_id,
|
482
|
+
logout_other_sessions=logout_other_sessions,
|
483
|
+
)
|
484
|
+
except HTTPException as he:
|
485
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
486
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
487
|
+
except Exception as e:
|
488
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
489
|
+
output_content = get_api_output_in_standard_format(
|
490
|
+
message=messages["GENERIC_500"], log=str(e)
|
491
|
+
)
|
492
|
+
return JSONResponse(
|
493
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
494
|
+
)
|
@@ -0,0 +1,126 @@
|
|
1
|
+
from typing import Annotated, Optional
|
2
|
+
|
3
|
+
from fastapi import APIRouter, Header, HTTPException, UploadFile, status
|
4
|
+
from fastapi.responses import JSONResponse
|
5
|
+
from square_commons import get_api_output_in_standard_format
|
6
|
+
|
7
|
+
from square_authentication.configuration import (
|
8
|
+
global_object_square_logger,
|
9
|
+
)
|
10
|
+
from square_authentication.messages import messages
|
11
|
+
from square_authentication.pydantic_models.profile import (
|
12
|
+
ValidateEmailVerificationCodeV0,
|
13
|
+
)
|
14
|
+
from square_authentication.utils.routes.profile import (
|
15
|
+
util_update_profile_photo_v0,
|
16
|
+
util_update_profile_details_v0,
|
17
|
+
util_send_verification_email_v0,
|
18
|
+
util_validate_email_verification_code_v0,
|
19
|
+
)
|
20
|
+
|
21
|
+
router = APIRouter(
|
22
|
+
tags=["profile"],
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
@router.patch("/update_profile_photo/v0")
|
27
|
+
@global_object_square_logger.auto_logger()
|
28
|
+
async def update_profile_photo_v0(
|
29
|
+
access_token: Annotated[str, Header()],
|
30
|
+
profile_photo: Optional[UploadFile] = None,
|
31
|
+
):
|
32
|
+
try:
|
33
|
+
return util_update_profile_photo_v0(
|
34
|
+
access_token=access_token,
|
35
|
+
profile_photo=profile_photo,
|
36
|
+
)
|
37
|
+
except HTTPException as he:
|
38
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
39
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
40
|
+
except Exception as e:
|
41
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
42
|
+
output_content = get_api_output_in_standard_format(
|
43
|
+
message=messages["GENERIC_500"], log=str(e)
|
44
|
+
)
|
45
|
+
return JSONResponse(
|
46
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
@router.patch("/update_profile_details/v0")
|
51
|
+
@global_object_square_logger.auto_logger()
|
52
|
+
async def update_profile_details_v0(
|
53
|
+
access_token: Annotated[str, Header()],
|
54
|
+
first_name: Optional[str] = None,
|
55
|
+
last_name: Optional[str] = None,
|
56
|
+
email: Optional[str] = None,
|
57
|
+
phone_number_country_code: Optional[str] = None,
|
58
|
+
phone_number: Optional[str] = None,
|
59
|
+
):
|
60
|
+
try:
|
61
|
+
return util_update_profile_details_v0(
|
62
|
+
access_token=access_token,
|
63
|
+
first_name=first_name,
|
64
|
+
last_name=last_name,
|
65
|
+
email=email,
|
66
|
+
phone_number_country_code=phone_number_country_code,
|
67
|
+
phone_number=phone_number,
|
68
|
+
)
|
69
|
+
except HTTPException as he:
|
70
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
71
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
72
|
+
except Exception as e:
|
73
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
74
|
+
output_content = get_api_output_in_standard_format(
|
75
|
+
message=messages["GENERIC_500"], log=str(e)
|
76
|
+
)
|
77
|
+
return JSONResponse(
|
78
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
79
|
+
)
|
80
|
+
|
81
|
+
|
82
|
+
@router.post("/send_verification_email/v0")
|
83
|
+
@global_object_square_logger.auto_logger()
|
84
|
+
async def send_verification_email_v0(
|
85
|
+
access_token: Annotated[str, Header()],
|
86
|
+
):
|
87
|
+
try:
|
88
|
+
return util_send_verification_email_v0(
|
89
|
+
access_token=access_token,
|
90
|
+
)
|
91
|
+
except HTTPException as he:
|
92
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
93
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
94
|
+
except Exception as e:
|
95
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
96
|
+
output_content = get_api_output_in_standard_format(
|
97
|
+
message=messages["GENERIC_500"], log=str(e)
|
98
|
+
)
|
99
|
+
return JSONResponse(
|
100
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
101
|
+
)
|
102
|
+
|
103
|
+
|
104
|
+
@router.post("/validate_email_verification_code/v0")
|
105
|
+
@global_object_square_logger.auto_logger()
|
106
|
+
async def validate_email_verification_code_v0(
|
107
|
+
access_token: Annotated[str, Header()],
|
108
|
+
body: ValidateEmailVerificationCodeV0,
|
109
|
+
):
|
110
|
+
verification_code = body.verification_code
|
111
|
+
try:
|
112
|
+
return util_validate_email_verification_code_v0(
|
113
|
+
access_token=access_token,
|
114
|
+
verification_code=verification_code,
|
115
|
+
)
|
116
|
+
except HTTPException as he:
|
117
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
118
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
119
|
+
except Exception as e:
|
120
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
121
|
+
output_content = get_api_output_in_standard_format(
|
122
|
+
message=messages["GENERIC_500"], log=str(e)
|
123
|
+
)
|
124
|
+
return JSONResponse(
|
125
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
126
|
+
)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
from fastapi import APIRouter, status, HTTPException
|
2
|
+
from fastapi.responses import JSONResponse
|
3
|
+
from square_commons import get_api_output_in_standard_format
|
4
|
+
|
5
|
+
from square_authentication.configuration import global_object_square_logger
|
6
|
+
from square_authentication.messages import messages
|
7
|
+
from square_authentication.utils.routes.utility import util_get_text_hash_v0
|
8
|
+
|
9
|
+
router = APIRouter(
|
10
|
+
tags=["utility"],
|
11
|
+
)
|
12
|
+
|
13
|
+
|
14
|
+
@router.get("/get_text_hash/v0")
|
15
|
+
@global_object_square_logger.auto_logger()
|
16
|
+
async def get_text_hash_v0(plain_text: str):
|
17
|
+
try:
|
18
|
+
return util_get_text_hash_v0(
|
19
|
+
plain_text=plain_text,
|
20
|
+
)
|
21
|
+
except HTTPException as he:
|
22
|
+
global_object_square_logger.logger.error(he, exc_info=True)
|
23
|
+
return JSONResponse(status_code=he.status_code, content=he.detail)
|
24
|
+
except Exception as e:
|
25
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
26
|
+
output_content = get_api_output_in_standard_format(
|
27
|
+
message=messages["GENERIC_500"], log=str(e)
|
28
|
+
)
|
29
|
+
return JSONResponse(
|
30
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
31
|
+
)
|
File without changes
|
@@ -5,12 +5,10 @@ import random
|
|
5
5
|
import re
|
6
6
|
import uuid
|
7
7
|
from datetime import datetime, timedelta, timezone
|
8
|
-
from typing import Annotated, List
|
9
8
|
|
10
9
|
import bcrypt
|
11
10
|
import jwt
|
12
|
-
from fastapi import
|
13
|
-
from fastapi.params import Query
|
11
|
+
from fastapi import HTTPException, status
|
14
12
|
from fastapi.responses import JSONResponse
|
15
13
|
from google.auth.transport import requests as google_requests
|
16
14
|
from google.oauth2 import id_token
|
@@ -45,6 +43,9 @@ from square_database_structure.square.public import (
|
|
45
43
|
)
|
46
44
|
from square_database_structure.square.public.tables import App
|
47
45
|
|
46
|
+
from square_authentication.configuration import (
|
47
|
+
GOOGLE_AUTH_PLATFORM_CLIENT_ID,
|
48
|
+
)
|
48
49
|
from square_authentication.configuration import (
|
49
50
|
config_int_access_token_valid_minutes,
|
50
51
|
config_int_refresh_token_valid_minutes,
|
@@ -53,7 +54,6 @@ from square_authentication.configuration import (
|
|
53
54
|
global_object_square_logger,
|
54
55
|
global_object_square_database_helper,
|
55
56
|
MAIL_GUN_API_KEY,
|
56
|
-
GOOGLE_AUTH_PLATFORM_CLIENT_ID,
|
57
57
|
NUMBER_OF_RECOVERY_CODES,
|
58
58
|
NUMBER_OF_DIGITS_IN_EMAIL_PASSWORD_RESET_CODE,
|
59
59
|
EXPIRY_TIME_FOR_EMAIL_PASSWORD_RESET_CODE_IN_SECONDS,
|
@@ -62,34 +62,14 @@ from square_authentication.configuration import (
|
|
62
62
|
)
|
63
63
|
from square_authentication.messages import messages
|
64
64
|
from square_authentication.pydantic_models.core import (
|
65
|
-
DeleteUserV0,
|
66
|
-
LoginUsernameV0,
|
67
|
-
LogoutAppsV0,
|
68
|
-
RegisterUsernameV0,
|
69
65
|
TokenType,
|
70
|
-
UpdatePasswordV0,
|
71
|
-
ResetPasswordAndLoginUsingBackupCodeV0,
|
72
|
-
SendResetPasswordEmailV0,
|
73
|
-
ResetPasswordAndLoginUsingResetEmailCodeV0,
|
74
|
-
RegisterLoginGoogleV0,
|
75
66
|
)
|
76
67
|
from square_authentication.utils.core import generate_default_username_for_google_users
|
77
68
|
from square_authentication.utils.token import get_jwt_payload
|
78
69
|
|
79
|
-
router = APIRouter(
|
80
|
-
tags=["core"],
|
81
|
-
)
|
82
|
-
|
83
70
|
|
84
|
-
@router.post("/register_username/v0")
|
85
71
|
@global_object_square_logger.auto_logger()
|
86
|
-
|
87
|
-
body: RegisterUsernameV0,
|
88
|
-
):
|
89
|
-
username = body.username
|
90
|
-
password = body.password
|
91
|
-
app_id = body.app_id
|
92
|
-
|
72
|
+
def util_register_username_v0(username, password, app_id):
|
93
73
|
local_str_user_id = None
|
94
74
|
local_str_access_token = None
|
95
75
|
local_str_refresh_token = None
|
@@ -296,11 +276,8 @@ async def register_username_v0(
|
|
296
276
|
)
|
297
277
|
|
298
278
|
|
299
|
-
@
|
300
|
-
|
301
|
-
app_id = body.app_id
|
302
|
-
google_id = body.google_id
|
303
|
-
assign_app_id_if_missing = body.assign_app_id_if_missing
|
279
|
+
@global_object_square_logger.auto_logger()
|
280
|
+
def util_register_login_google_v0(google_id, assign_app_id_if_missing, app_id):
|
304
281
|
was_new_user = False
|
305
282
|
try:
|
306
283
|
"""
|
@@ -656,11 +633,8 @@ async def register_login_google_v0(body: RegisterLoginGoogleV0):
|
|
656
633
|
)
|
657
634
|
|
658
635
|
|
659
|
-
@router.get("/get_user_details/v0")
|
660
636
|
@global_object_square_logger.auto_logger()
|
661
|
-
|
662
|
-
access_token: Annotated[str, Header()],
|
663
|
-
):
|
637
|
+
def util_get_user_details_v0(access_token):
|
664
638
|
try:
|
665
639
|
"""
|
666
640
|
validation
|
@@ -793,13 +767,8 @@ async def get_user_details_v0(
|
|
793
767
|
)
|
794
768
|
|
795
769
|
|
796
|
-
@router.patch("/update_user_app_ids/v0")
|
797
770
|
@global_object_square_logger.auto_logger()
|
798
|
-
|
799
|
-
access_token: Annotated[str, Header()],
|
800
|
-
app_ids_to_add: List[int],
|
801
|
-
app_ids_to_remove: List[int],
|
802
|
-
):
|
771
|
+
def util_update_user_app_ids_v0(access_token, app_ids_to_add, app_ids_to_remove):
|
803
772
|
try:
|
804
773
|
|
805
774
|
"""
|
@@ -954,14 +923,8 @@ async def update_user_app_ids_v0(
|
|
954
923
|
)
|
955
924
|
|
956
925
|
|
957
|
-
@router.post("/login_username/v0")
|
958
926
|
@global_object_square_logger.auto_logger()
|
959
|
-
|
960
|
-
username = body.username
|
961
|
-
password = body.password
|
962
|
-
app_id = body.app_id
|
963
|
-
assign_app_id_if_missing = body.assign_app_id_if_missing
|
964
|
-
username = username.lower()
|
927
|
+
def util_login_username_v0(username, password, app_id, assign_app_id_if_missing):
|
965
928
|
try:
|
966
929
|
"""
|
967
930
|
validation
|
@@ -1184,11 +1147,8 @@ async def login_username_v0(body: LoginUsernameV0):
|
|
1184
1147
|
)
|
1185
1148
|
|
1186
1149
|
|
1187
|
-
@router.get("/generate_access_token/v0")
|
1188
1150
|
@global_object_square_logger.auto_logger()
|
1189
|
-
|
1190
|
-
refresh_token: Annotated[str, Header()],
|
1191
|
-
):
|
1151
|
+
def util_generate_access_token_v0(refresh_token):
|
1192
1152
|
try:
|
1193
1153
|
"""
|
1194
1154
|
validation
|
@@ -1275,11 +1235,8 @@ async def generate_access_token_v0(
|
|
1275
1235
|
)
|
1276
1236
|
|
1277
1237
|
|
1278
|
-
@router.delete("/logout/v0")
|
1279
1238
|
@global_object_square_logger.auto_logger()
|
1280
|
-
|
1281
|
-
refresh_token: Annotated[str, Header()],
|
1282
|
-
):
|
1239
|
+
def util_logout_v0(refresh_token):
|
1283
1240
|
try:
|
1284
1241
|
"""
|
1285
1242
|
validation
|
@@ -1367,13 +1324,8 @@ async def logout_v0(
|
|
1367
1324
|
)
|
1368
1325
|
|
1369
1326
|
|
1370
|
-
@router.post("/logout/apps/v0")
|
1371
1327
|
@global_object_square_logger.auto_logger()
|
1372
|
-
|
1373
|
-
access_token: Annotated[str, Header()],
|
1374
|
-
body: LogoutAppsV0,
|
1375
|
-
):
|
1376
|
-
app_ids = body.app_ids
|
1328
|
+
def util_logout_apps_v0(access_token, app_ids):
|
1377
1329
|
try:
|
1378
1330
|
"""
|
1379
1331
|
validation
|
@@ -1460,12 +1412,8 @@ async def logout_apps_v0(
|
|
1460
1412
|
)
|
1461
1413
|
|
1462
1414
|
|
1463
|
-
@router.delete("/logout/all/v0")
|
1464
1415
|
@global_object_square_logger.auto_logger()
|
1465
|
-
|
1466
|
-
access_token: Annotated[str, Header()],
|
1467
|
-
):
|
1468
|
-
|
1416
|
+
def util_logout_all_v0(access_token):
|
1469
1417
|
try:
|
1470
1418
|
"""
|
1471
1419
|
validation
|
@@ -1524,12 +1472,8 @@ async def logout_all_v0(
|
|
1524
1472
|
)
|
1525
1473
|
|
1526
1474
|
|
1527
|
-
@router.patch("/update_username/v0")
|
1528
1475
|
@global_object_square_logger.auto_logger()
|
1529
|
-
|
1530
|
-
new_username: str,
|
1531
|
-
access_token: Annotated[str, Header()],
|
1532
|
-
):
|
1476
|
+
def util_update_username_v0(new_username, access_token):
|
1533
1477
|
try:
|
1534
1478
|
"""
|
1535
1479
|
validation
|
@@ -1652,13 +1596,8 @@ async def update_username_v0(
|
|
1652
1596
|
)
|
1653
1597
|
|
1654
1598
|
|
1655
|
-
@router.post("/delete_user/v0")
|
1656
1599
|
@global_object_square_logger.auto_logger()
|
1657
|
-
|
1658
|
-
body: DeleteUserV0,
|
1659
|
-
access_token: Annotated[str, Header()],
|
1660
|
-
):
|
1661
|
-
password = body.password
|
1600
|
+
def util_delete_user_v0(access_token, password):
|
1662
1601
|
try:
|
1663
1602
|
"""
|
1664
1603
|
validation
|
@@ -1781,16 +1720,14 @@ async def delete_user_v0(
|
|
1781
1720
|
)
|
1782
1721
|
|
1783
1722
|
|
1784
|
-
@router.patch("/update_password/v0")
|
1785
1723
|
@global_object_square_logger.auto_logger()
|
1786
|
-
|
1787
|
-
|
1788
|
-
|
1724
|
+
def util_update_password_v0(
|
1725
|
+
access_token,
|
1726
|
+
old_password,
|
1727
|
+
new_password,
|
1728
|
+
logout_other_sessions,
|
1729
|
+
preserve_session_refresh_token,
|
1789
1730
|
):
|
1790
|
-
old_password = body.old_password
|
1791
|
-
new_password = body.new_password
|
1792
|
-
logout_other_sessions = body.logout_other_sessions
|
1793
|
-
preserve_session_refresh_token = body.preserve_session_refresh_token
|
1794
1731
|
try:
|
1795
1732
|
"""
|
1796
1733
|
validation
|
@@ -1995,14 +1932,8 @@ async def update_password_v0(
|
|
1995
1932
|
)
|
1996
1933
|
|
1997
1934
|
|
1998
|
-
@router.get("/validate_and_get_payload_from_token/v0")
|
1999
1935
|
@global_object_square_logger.auto_logger()
|
2000
|
-
|
2001
|
-
app_id: int,
|
2002
|
-
token: Annotated[str, Header()],
|
2003
|
-
token_type: TokenType = Query(...),
|
2004
|
-
):
|
2005
|
-
|
1936
|
+
def util_validate_and_get_payload_from_token_v0(app_id, token, token_type):
|
2006
1937
|
try:
|
2007
1938
|
"""
|
2008
1939
|
validation
|
@@ -2104,12 +2035,9 @@ async def validate_and_get_payload_from_token_v0(
|
|
2104
2035
|
)
|
2105
2036
|
|
2106
2037
|
|
2107
|
-
@router.patch("/update_user_recovery_methods/v0")
|
2108
2038
|
@global_object_square_logger.auto_logger()
|
2109
|
-
|
2110
|
-
access_token
|
2111
|
-
recovery_methods_to_add: List[RecoveryMethodEnum] = None,
|
2112
|
-
recovery_methods_to_remove: List[RecoveryMethodEnum] = None,
|
2039
|
+
def util_update_user_recovery_methods_v0(
|
2040
|
+
access_token, recovery_methods_to_add, recovery_methods_to_remove
|
2113
2041
|
):
|
2114
2042
|
if recovery_methods_to_add is None:
|
2115
2043
|
recovery_methods_to_add = []
|
@@ -2329,12 +2257,8 @@ async def update_user_recovery_methods_v0(
|
|
2329
2257
|
)
|
2330
2258
|
|
2331
2259
|
|
2332
|
-
@router.post("/generate_account_backup_codes/v0")
|
2333
2260
|
@global_object_square_logger.auto_logger()
|
2334
|
-
|
2335
|
-
access_token: Annotated[str, Header()],
|
2336
|
-
):
|
2337
|
-
|
2261
|
+
def util_generate_account_backup_codes_v0(access_token):
|
2338
2262
|
try:
|
2339
2263
|
"""
|
2340
2264
|
validation
|
@@ -2470,16 +2394,10 @@ async def generate_account_backup_codes_v0(
|
|
2470
2394
|
)
|
2471
2395
|
|
2472
2396
|
|
2473
|
-
@router.post("/reset_password_and_login_using_backup_code/v0")
|
2474
2397
|
@global_object_square_logger.auto_logger()
|
2475
|
-
|
2476
|
-
|
2398
|
+
def util_reset_password_and_login_using_backup_code_v0(
|
2399
|
+
backup_code, username, new_password, app_id, logout_other_sessions
|
2477
2400
|
):
|
2478
|
-
backup_code = body.backup_code
|
2479
|
-
username = body.username
|
2480
|
-
new_password = body.new_password
|
2481
|
-
app_id = body.app_id
|
2482
|
-
logout_other_sessions = body.logout_other_sessions
|
2483
2401
|
try:
|
2484
2402
|
"""
|
2485
2403
|
validation
|
@@ -2753,12 +2671,10 @@ async def reset_password_and_login_using_backup_code_v0(
|
|
2753
2671
|
)
|
2754
2672
|
|
2755
2673
|
|
2756
|
-
@router.post("/send_reset_password_email/v0")
|
2757
2674
|
@global_object_square_logger.auto_logger()
|
2758
|
-
|
2759
|
-
|
2675
|
+
def util_send_reset_password_email_v0(
|
2676
|
+
username,
|
2760
2677
|
):
|
2761
|
-
username = body.username
|
2762
2678
|
try:
|
2763
2679
|
"""
|
2764
2680
|
validation
|
@@ -2963,7 +2879,7 @@ async def send_reset_password_email_v0(
|
|
2963
2879
|
to_email=user_profile_data[UserProfile.user_profile_email.name],
|
2964
2880
|
to_name=user_to_name,
|
2965
2881
|
subject="Password Reset Verification Code",
|
2966
|
-
body=f"Your Password Reset verification code is {verification_code}. It will expire in {EXPIRY_TIME_FOR_EMAIL_PASSWORD_RESET_CODE_IN_SECONDS/60} minutes.",
|
2882
|
+
body=f"Your Password Reset verification code is {verification_code}. It will expire in {EXPIRY_TIME_FOR_EMAIL_PASSWORD_RESET_CODE_IN_SECONDS / 60} minutes.",
|
2967
2883
|
api_key=MAIL_GUN_API_KEY,
|
2968
2884
|
domain_name="thepmsquare.com",
|
2969
2885
|
)
|
@@ -3021,16 +2937,10 @@ async def send_reset_password_email_v0(
|
|
3021
2937
|
)
|
3022
2938
|
|
3023
2939
|
|
3024
|
-
@router.post("/reset_password_and_login_using_reset_email_code/v0")
|
3025
2940
|
@global_object_square_logger.auto_logger()
|
3026
|
-
|
3027
|
-
|
2941
|
+
def util_reset_password_and_login_using_reset_email_code_v0(
|
2942
|
+
reset_email_code, username, new_password, app_id, logout_other_sessions
|
3028
2943
|
):
|
3029
|
-
reset_email_code = body.reset_email_code
|
3030
|
-
username = body.username
|
3031
|
-
new_password = body.new_password
|
3032
|
-
app_id = body.app_id
|
3033
|
-
logout_other_sessions = body.logout_other_sessions
|
3034
2944
|
try:
|
3035
2945
|
"""
|
3036
2946
|
validation
|
@@ -1,9 +1,8 @@
|
|
1
1
|
import random
|
2
2
|
from datetime import datetime, timedelta, timezone
|
3
|
-
from typing import Annotated, Optional
|
4
3
|
|
5
4
|
import bcrypt
|
6
|
-
from fastapi import
|
5
|
+
from fastapi import HTTPException, status
|
7
6
|
from fastapi.responses import JSONResponse
|
8
7
|
from square_commons import get_api_output_in_standard_format
|
9
8
|
from square_commons.email import send_email_using_mailgun
|
@@ -31,27 +30,17 @@ from square_authentication.configuration import (
|
|
31
30
|
RESEND_COOL_DOWN_TIME_FOR_EMAIL_VERIFICATION_CODE_IN_SECONDS,
|
32
31
|
config_str_secret_key_for_access_token,
|
33
32
|
global_object_square_database_helper,
|
34
|
-
global_object_square_file_store_helper,
|
35
33
|
global_object_square_logger,
|
36
34
|
)
|
37
|
-
from square_authentication.
|
38
|
-
|
39
|
-
ValidateEmailVerificationCodeV0,
|
35
|
+
from square_authentication.configuration import (
|
36
|
+
global_object_square_file_store_helper,
|
40
37
|
)
|
38
|
+
from square_authentication.messages import messages
|
41
39
|
from square_authentication.utils.token import get_jwt_payload
|
42
40
|
|
43
|
-
router = APIRouter(
|
44
|
-
tags=["profile"],
|
45
|
-
)
|
46
41
|
|
47
|
-
|
48
|
-
@router.patch("/update_profile_photo/v0")
|
49
42
|
@global_object_square_logger.auto_logger()
|
50
|
-
|
51
|
-
access_token: Annotated[str, Header()],
|
52
|
-
profile_photo: Optional[UploadFile] = None,
|
53
|
-
):
|
54
|
-
|
43
|
+
def util_update_profile_photo_v0(access_token, profile_photo):
|
55
44
|
try:
|
56
45
|
"""
|
57
46
|
validation
|
@@ -188,15 +177,14 @@ async def update_profile_photo_v0(
|
|
188
177
|
)
|
189
178
|
|
190
179
|
|
191
|
-
@router.patch("/update_profile_details/v0")
|
192
180
|
@global_object_square_logger.auto_logger()
|
193
|
-
|
194
|
-
access_token
|
195
|
-
first_name
|
196
|
-
last_name
|
197
|
-
email
|
198
|
-
phone_number_country_code
|
199
|
-
phone_number
|
181
|
+
def util_update_profile_details_v0(
|
182
|
+
access_token,
|
183
|
+
first_name,
|
184
|
+
last_name,
|
185
|
+
email,
|
186
|
+
phone_number_country_code,
|
187
|
+
phone_number,
|
200
188
|
):
|
201
189
|
try:
|
202
190
|
"""
|
@@ -308,11 +296,8 @@ async def update_profile_details_v0(
|
|
308
296
|
)
|
309
297
|
|
310
298
|
|
311
|
-
@router.post("/send_verification_email/v0")
|
312
299
|
@global_object_square_logger.auto_logger()
|
313
|
-
|
314
|
-
access_token: Annotated[str, Header()],
|
315
|
-
):
|
300
|
+
def util_send_verification_email_v0(access_token):
|
316
301
|
try:
|
317
302
|
"""
|
318
303
|
validation
|
@@ -455,7 +440,7 @@ async def send_verification_email_v0(
|
|
455
440
|
to_email=user_profile_data[UserProfile.user_profile_email.name],
|
456
441
|
to_name=user_to_name,
|
457
442
|
subject="Email Verification",
|
458
|
-
body=f"Your verification code is {verification_code}. It will expire in {EXPIRY_TIME_FOR_EMAIL_VERIFICATION_CODE_IN_SECONDS/60} minutes.",
|
443
|
+
body=f"Your verification code is {verification_code}. It will expire in {EXPIRY_TIME_FOR_EMAIL_VERIFICATION_CODE_IN_SECONDS / 60} minutes.",
|
459
444
|
api_key=MAIL_GUN_API_KEY,
|
460
445
|
domain_name="thepmsquare.com",
|
461
446
|
)
|
@@ -512,13 +497,8 @@ async def send_verification_email_v0(
|
|
512
497
|
)
|
513
498
|
|
514
499
|
|
515
|
-
@router.post("/validate_email_verification_code/v0")
|
516
500
|
@global_object_square_logger.auto_logger()
|
517
|
-
|
518
|
-
access_token: Annotated[str, Header()],
|
519
|
-
body: ValidateEmailVerificationCodeV0,
|
520
|
-
):
|
521
|
-
verification_code = body.verification_code
|
501
|
+
def util_validate_email_verification_code_v0(access_token, verification_code):
|
522
502
|
try:
|
523
503
|
"""
|
524
504
|
validation
|
@@ -1,20 +1,14 @@
|
|
1
1
|
import bcrypt
|
2
|
-
from fastapi import
|
2
|
+
from fastapi import status, HTTPException
|
3
3
|
from fastapi.responses import JSONResponse
|
4
4
|
from square_commons import get_api_output_in_standard_format
|
5
5
|
|
6
6
|
from square_authentication.configuration import global_object_square_logger
|
7
7
|
from square_authentication.messages import messages
|
8
8
|
|
9
|
-
router = APIRouter(
|
10
|
-
tags=["utility"],
|
11
|
-
)
|
12
9
|
|
13
|
-
|
14
|
-
@router.get("/get_text_hash/v0")
|
15
10
|
@global_object_square_logger.auto_logger()
|
16
|
-
|
17
|
-
|
11
|
+
def util_get_text_hash_v0(plain_text):
|
18
12
|
try:
|
19
13
|
"""
|
20
14
|
validation
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: square_authentication
|
3
|
-
Version: 10.0.
|
3
|
+
Version: 10.0.2
|
4
4
|
Summary: authentication layer for my personal server.
|
5
5
|
Home-page: https://github.com/thepmsquare/square_authentication
|
6
6
|
Author: Parth Mukesh Mangtani
|
@@ -54,7 +54,12 @@ authentication layer for my personal server.
|
|
54
54
|
|
55
55
|
## goals
|
56
56
|
|
57
|
-
|
57
|
+
- integration with square_*
|
58
|
+
- unified authentication api across all projects
|
59
|
+
- jwt token support
|
60
|
+
- simple user and user profile management
|
61
|
+
- oauth support
|
62
|
+
- future extensibility
|
58
63
|
|
59
64
|
## Installation
|
60
65
|
|
@@ -24,6 +24,10 @@ square_authentication/utils/__init__.py
|
|
24
24
|
square_authentication/utils/core.py
|
25
25
|
square_authentication/utils/encryption.py
|
26
26
|
square_authentication/utils/token.py
|
27
|
+
square_authentication/utils/routes/__init__.py
|
28
|
+
square_authentication/utils/routes/core.py
|
29
|
+
square_authentication/utils/routes/profile.py
|
30
|
+
square_authentication/utils/routes/utility.py
|
27
31
|
tests/test_1.py
|
28
32
|
tests/test_authentication.py
|
29
33
|
tests/test_delete_user.py
|
File without changes
|
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/__init__.py
RENAMED
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/configuration.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/messages.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/core.py
RENAMED
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/square_authentication/utils/token.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_email_verification.py
RENAMED
File without changes
|
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_profile_management.py
RENAMED
File without changes
|
{square_authentication-10.0.1 → square_authentication-10.0.2}/tests/test_token_management.py
RENAMED
File without changes
|
File without changes
|
File without changes
|