Commit 50154cc1 authored by arun.uday's avatar arun.uday

test Commit

parent eb668bf5
MONGO_URI=mongodb://localhost:27017 MONGO_URI=mongodb://localhost:27017
DB_NAME=userDB DB_NAME=userDB
REDIS_URI=redis://127.0.0.1:6379
REDIS_LOGIN_DB=10
SERVICE_HOST=0.0.0.0 SERVICE_HOST=0.0.0.0
SERVICE_PORT=8671 SERVICE_PORT=8671
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Author: Arun Uday Author: Arun Uday
Email: arun.uday@knowledgelens.com Email: arun.uday@knowledgelens.com
Asset Manager Login For Normal User Login Asset Manager Login / Registration
--------------------------------------------------------- ---------------------------------------------------------
""" """
......
...@@ -9,3 +9,4 @@ email-validator~=1.3.1 ...@@ -9,3 +9,4 @@ email-validator~=1.3.1
pycryptodomex~=3.17 pycryptodomex~=3.17
PyJWT~=2.6.0 PyJWT~=2.6.0
validate_email~=1.3 validate_email~=1.3
redis~=4.5.2
\ No newline at end of file
...@@ -17,15 +17,13 @@ class _Services(BaseSettings): ...@@ -17,15 +17,13 @@ class _Services(BaseSettings):
CORS_ALLOW_HEADERS: list[str] = ["*"] CORS_ALLOW_HEADERS: list[str] = ["*"]
LOG_LEVEL: Literal["INFO", "DEBUG", "ERROR", "QTRACE"] = "INFO" LOG_LEVEL: Literal["INFO", "DEBUG", "ERROR", "QTRACE"] = "INFO"
ENABLE_FILE_LOGGING: bool = False ENABLE_FILE_LOGGING: bool = False
KEY_ENCRYPTION = "kliLensKLiLensKL"
SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
class _Databases(BaseSettings): class _Databases(BaseSettings):
MONGO_URI: str MONGO_URI: str
DB_NAME: str DB_NAME: str
REDIS_URI: str
REDIS_LOGIN_DB: int
class _BasePathConf(BaseSettings): class _BasePathConf(BaseSettings):
...@@ -37,12 +35,23 @@ class _PathConf: ...@@ -37,12 +35,23 @@ class _PathConf:
LOG_PATH: pathlib.Path = BASE_PATH / "log/" LOG_PATH: pathlib.Path = BASE_PATH / "log/"
class _Secrets(BaseSettings):
ACCESS_TOKEN_EXPIRE_MINUTES = 30
leeway_in_minutes: int = 10
KEY_ENCRYPTION = "kliLensKLiLensKL"
issuer: str = "iotManager"
SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
ALGORITHM = "HS256"
Services = _Services() Services = _Services()
Databases = _Databases() Databases = _Databases()
PathConf = _PathConf() PathConf = _PathConf()
Secrets = _Secrets()
__all__ = [ __all__ = [
"Services", "Services",
"Databases", "Databases",
"PathConf", "PathConf",
"Secrets"
] ]
...@@ -9,7 +9,7 @@ class LoginHandlers: ...@@ -9,7 +9,7 @@ class LoginHandlers:
def __init__(self): def __init__(self):
self.obj_login_handler = NormalLogin() self.obj_login_handler = NormalLogin()
def normal_login(self, login_data): def normal_login(self, login_data, request):
# decrypting the password from the UI # decrypting the password from the UI
decrypted_password = self.obj_login_handler.password_decrypt(login_data.payload["password"]) decrypted_password = self.obj_login_handler.password_decrypt(login_data.payload["password"])
# validating the received inputs empty or not # validating the received inputs empty or not
...@@ -27,7 +27,7 @@ class LoginHandlers: ...@@ -27,7 +27,7 @@ class LoginHandlers:
return JSONResponse(content=DefaultFailureResponse(error=data).dict(), return JSONResponse(content=DefaultFailureResponse(error=data).dict(),
status_code=status.HTTP_401_UNAUTHORIZED) status_code=status.HTTP_401_UNAUTHORIZED)
# generating the access tokens # generating the access tokens
response = self.obj_login_handler.generate_tokens(login_data.payload, data) response = self.obj_login_handler.generate_cookie_tokens(login_data.payload, request)
# token generation unsuccessful # token generation unsuccessful
if response is None: if response is None:
return JSONResponse( return JSONResponse(
......
from __future__ import annotations from __future__ import annotations
import base64 import base64
from datetime import datetime, timedelta from datetime import datetime
import jwt
from Cryptodome.Cipher import AES from Cryptodome.Cipher import AES
from passlib.context import CryptContext from passlib.context import CryptContext
from validate_email import validate_email from validate_email import validate_email
from scripts.config import Services from scripts.config import *
from scripts.database.mongo.mongo_login import MongoUser from scripts.database.mongo.mongo_login import MongoUser
from scripts.database.redis.redis_conn import login_db
from scripts.errors import ErrorMessages from scripts.errors import ErrorMessages
from scripts.logging.logger import logger from scripts.logging.logger import logger
from scripts.utils.security.apply_encrytion_util import create_token
class NormalLogin: class NormalLogin:
...@@ -31,7 +32,7 @@ class NormalLogin: ...@@ -31,7 +32,7 @@ class NormalLogin:
def password_decrypt(self, password): def password_decrypt(self, password):
try: try:
# encoding the Key # encoding the Key
key = Services.KEY_ENCRYPTION.encode(Services.ENCODING_TYPE) key = Secrets.KEY_ENCRYPTION.encode(Services.ENCODING_TYPE)
# decoding the received password # decoding the received password
enc = base64.b64decode(password) enc = base64.b64decode(password)
# mode for the decryption # mode for the decryption
...@@ -46,7 +47,7 @@ class NormalLogin: ...@@ -46,7 +47,7 @@ class NormalLogin:
raise ValueError("Decrypted data is empty") raise ValueError("Decrypted data is empty")
# removing the padding to get the password # removing the padding to get the password
data = self.un_pad(data) data = self.un_pad(data)
return data.decode('utf-8') return data.decode(Services.ENCODING_TYPE)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
...@@ -96,33 +97,16 @@ class NormalLogin: ...@@ -96,33 +97,16 @@ class NormalLogin:
logger.exception(e) logger.exception(e)
@staticmethod @staticmethod
def create_access_token(data: dict, expires_delta): def generate_cookie_tokens(login_data, request):
try: try:
# creating a copy of the data
to_encode = data.copy()
# checking if the expires_delta is empty
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
# updating the data with the expiration time
to_encode.update({"expire": expire.isoformat()})
# creating the token
encoded_jwt = jwt.encode(to_encode, Services.SECRET_KEY, algorithm=Services.ALGORITHM)
return encoded_jwt
except Exception as e:
logger.exception(e)
def generate_tokens(self, login_data, data):
try:
# creating the expiration time
access_token_expires = timedelta(minutes=Services.ACCESS_TOKEN_EXPIRE_MINUTES)
# creating the access token # creating the access token
access_token = self.create_access_token( access_token = create_token(
data={"username": login_data["username"], "role": data["role"]}, expires_delta=access_token_expires user_id=login_data["username"],
ip=request.ip_address,
project_id=Services.PROJECT_ID,
) )
if access_token: if access_token:
return {"access_token": access_token, "token_type": "bearer"} return {"user_id": access_token, "token_type": "bearer"}
else: else:
return None return None
except Exception as e: except Exception as e:
......
import redis
from scripts.config import Databases
redis_uri = Databases.REDIS_URI
login_db = redis.from_url(
redis_uri, db=int(Databases.REDIS_LOGIN_DB), decode_responses=True
)
...@@ -384,3 +384,350 @@ TypeError: string indices must be integers ...@@ -384,3 +384,350 @@ TypeError: string indices must be integers
2023-03-21 15:28:58 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671 2023-03-21 15:28:58 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-21 15:30:05 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671 2023-03-21 15:30:05 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-21 15:30:58 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671 2023-03-21 15:30:58 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-21 18:06:53 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-21 18:06:54 - ERROR - [MainThread:<module>(): 41] - 'list' object is not callable
Traceback (most recent call last):
File "E:\Git\meta-services\app.py", line 39, in <module>
uvicorn.run("main:app", host=arguments["bind"], port=int(arguments["port"]))
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\main.py", line 568, in run
server.run()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "E:\Git\meta-services\main.py", line 17, in <module>
from scripts.services import router
File "E:\Git\meta-services\scripts\services\__init__.py", line 2, in <module>
from scripts.services import v1
File "E:\Git\meta-services\scripts\services\v1\__init__.py", line 3, in <module>
from scripts.services.v1 import iot_manager_services
File "E:\Git\meta-services\scripts\services\v1\iot_manager_services.py", line 14, in <module>
@router.routes(ApiEndPoints.asset_manager_submit)
TypeError: 'list' object is not callable
2023-03-21 18:07:52 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-21 18:08:38 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 09:55:22 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 09:55:45 - ERROR - [MainThread:create_access_token(): 114] - Algorithm 'RS256' could not be found. Do you have cryptography installed?
Traceback (most recent call last):
File "E:\Git\meta-services\venv\lib\site-packages\jwt\api_jws.py", line 88, in get_algorithm_by_name
return self._algorithms[alg_name]
KeyError: 'RS256'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 111, in create_access_token
encoded_jwt = jwt.encode(to_encode, Secrets.SECRET_KEY, algorithm=Secrets.ALGORITHM)
File "E:\Git\meta-services\venv\lib\site-packages\jwt\api_jwt.py", line 67, in encode
return api_jws.encode(json_payload, key, algorithm, headers, json_encoder)
File "E:\Git\meta-services\venv\lib\site-packages\jwt\api_jws.py", line 152, in encode
alg_obj = self.get_algorithm_by_name(algorithm_)
File "E:\Git\meta-services\venv\lib\site-packages\jwt\api_jws.py", line 91, in get_algorithm_by_name
raise NotImplementedError(
NotImplementedError: Algorithm 'RS256' could not be found. Do you have cryptography installed?
2023-03-22 09:57:43 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 10:56:52 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 10:58:59 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 10:59:38 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:23:37 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:27:35 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:43:20 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:44:21 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:45:09 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:45:35 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:45:55 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:46:34 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:48:03 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:50:47 - ERROR - [AnyIO worker thread:validate(): 40] - Exception while validating JWT: '_Secrets' object has no attribute 'leeway_in_mins'
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\jwt_util.py", line 35, in validate
leeway=Secrets.leeway_in_mins,
AttributeError: '_Secrets' object has no attribute 'leeway_in_mins'
2023-03-22 11:50:47 - ERROR - [AnyIO worker thread:__call__(): 66] -
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 64, in __call__
logger.exception(e)
fastapi.exceptions.HTTPException
2023-03-22 11:52:02 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:52:05 - ERROR - [AnyIO worker thread:validate(): 40] - Exception while validating JWT: '_Secrets' object has no attribute 'leeway_in_mins'
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\jwt_util.py", line 35, in validate
leeway=Secrets.leeway_in_mins,
AttributeError: '_Secrets' object has no attribute 'leeway_in_mins'
2023-03-22 11:52:05 - ERROR - [AnyIO worker thread:__call__(): 63] -
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 61, in __call__
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
fastapi.exceptions.HTTPException
2023-03-22 11:52:55 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:54:31 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:56:09 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:57:13 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 11:57:54 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:06:55 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:07:51 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:07:52 - ERROR - [MainThread:<module>(): 41] - 'await' outside async function (decorators.py, line 48)
Traceback (most recent call last):
File "E:\Git\meta-services\app.py", line 39, in <module>
uvicorn.run("main:app", host=arguments["bind"], port=int(arguments["port"]))
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\main.py", line 568, in run
server.run()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "E:\Git\meta-services\main.py", line 17, in <module>
from scripts.services import router
File "E:\Git\meta-services\scripts\services\__init__.py", line 2, in <module>
from scripts.services import v1
File "E:\Git\meta-services\scripts\services\v1\__init__.py", line 3, in <module>
from scripts.services.v1 import iot_manager_services
File "E:\Git\meta-services\scripts\services\v1\iot_manager_services.py", line 9, in <module>
from scripts.utils.security.decorators import MetaInfoSchema, auth
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 48
payload = await request.json()
^
SyntaxError: 'await' outside async function
2023-03-22 12:08:04 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:12:16 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:12:17 - ERROR - [MainThread:<module>(): 41] - 'await' outside async function (decorators.py, line 48)
Traceback (most recent call last):
File "E:\Git\meta-services\app.py", line 39, in <module>
uvicorn.run("main:app", host=arguments["bind"], port=int(arguments["port"]))
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\main.py", line 568, in run
server.run()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "E:\Git\meta-services\main.py", line 17, in <module>
from scripts.services import router
File "E:\Git\meta-services\scripts\services\__init__.py", line 2, in <module>
from scripts.services import v1
File "E:\Git\meta-services\scripts\services\v1\__init__.py", line 3, in <module>
from scripts.services.v1 import iot_manager_services
File "E:\Git\meta-services\scripts\services\v1\iot_manager_services.py", line 9, in <module>
from scripts.utils.security.decorators import MetaInfoSchema, auth
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 48
payload = await request.body()
^
SyntaxError: 'await' outside async function
2023-03-22 12:12:52 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:13:10 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:13:24 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:19:14 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:21:15 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:21:22 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:21:27 - ERROR - [MainThread:__call__(): 83] - 'project_id'
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 77, in __call__
if not payload["project_id"] or not payload["login_type"] or not payload["payload"]:
KeyError: 'project_id'
2023-03-22 12:39:57 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 12:40:05 - ERROR - [MainThread:__call__(): 83] - 'project_id'
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\utils\security\decorators.py", line 77, in __call__
if not payload["project_id"] or not payload["login_type"] or not payload["payload"]:
KeyError: 'project_id'
2023-03-22 12:43:23 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:43:31 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:43:54 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:48:45 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:49:00 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:49:22 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:49:39 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:49:54 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:50:14 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:53:46 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:54:04 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 14:54:29 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 15:07:09 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 15:07:12 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 15:09:59 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 15:10:21 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 15:11:18 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:33:21 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:33:23 - ERROR - [MainThread:<module>(): 41] - '_Secrets' object has no attribute 'LOCK_OUT_TIME_MINS'
Traceback (most recent call last):
File "E:\Git\meta-services\app.py", line 39, in <module>
uvicorn.run("main:app", host=arguments["bind"], port=int(arguments["port"]))
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\main.py", line 568, in run
server.run()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "E:\Git\meta-services\main.py", line 17, in <module>
from scripts.services import router
File "E:\Git\meta-services\scripts\services\__init__.py", line 2, in <module>
from scripts.services import v1
File "E:\Git\meta-services\scripts\services\v1\__init__.py", line 3, in <module>
from scripts.services.v1 import iot_manager_services
File "E:\Git\meta-services\scripts\services\v1\iot_manager_services.py", line 6, in <module>
from scripts.core.handlers.login_handler import LoginHandlers
File "E:\Git\meta-services\scripts\core\handlers\login_handler.py", line 1, in <module>
from scripts.core.handlers.normal_login import NormalLogin
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 15, in <module>
from scripts.utils.security.apply_encrytion_util import create_token
File "E:\Git\meta-services\scripts\utils\security\apply_encrytion_util.py", line 14, in <module>
age=Secrets.LOCK_OUT_TIME_MINS,
AttributeError: '_Secrets' object has no attribute 'LOCK_OUT_TIME_MINS'
2023-03-22 18:34:00 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:34:00 - ERROR - [MainThread:<module>(): 41] - expected an indented block (iot_manager_services.py, line 36)
Traceback (most recent call last):
File "E:\Git\meta-services\app.py", line 39, in <module>
uvicorn.run("main:app", host=arguments["bind"], port=int(arguments["port"]))
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\main.py", line 568, in run
server.run()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "E:\Git\meta-services\venv\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\Users\arun.uday\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "E:\Git\meta-services\main.py", line 17, in <module>
from scripts.services import router
File "E:\Git\meta-services\scripts\services\__init__.py", line 2, in <module>
from scripts.services import v1
File "E:\Git\meta-services\scripts\services\v1\__init__.py", line 3, in <module>
from scripts.services.v1 import iot_manager_services
File "E:\Git\meta-services\scripts\services\v1\iot_manager_services.py", line 36
except Exception as e:
^
IndentationError: expected an indented block
2023-03-22 18:35:06 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:35:12 - ERROR - [MainThread:generate_cookie_tokens(): 113] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 105, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:35:59 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:36:04 - ERROR - [MainThread:generate_cookie_tokens(): 113] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 105, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:37:04 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:37:15 - ERROR - [MainThread:generate_cookie_tokens(): 113] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 105, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:37:32 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:37:36 - ERROR - [MainThread:generate_cookie_tokens(): 113] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 105, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:37:52 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:37:56 - ERROR - [MainThread:generate_cookie_tokens(): 114] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 106, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:38:14 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:38:18 - ERROR - [MainThread:generate_cookie_tokens(): 116] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 103, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:38:48 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:38:51 - ERROR - [MainThread:generate_cookie_tokens(): 116] - 'MetaInfoSchema' object is not subscriptable
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 103, in generate_cookie_tokens
request['ip_address'],
TypeError: 'MetaInfoSchema' object is not subscriptable
2023-03-22 18:39:23 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:39:25 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:39:30 - ERROR - [MainThread:generate_cookie_tokens(): 116] - unsupported type for timedelta minutes component: str
Traceback (most recent call last):
File "E:\Git\meta-services\scripts\core\handlers\normal_login.py", line 106, in generate_cookie_tokens
access_token = create_token(
File "E:\Git\meta-services\scripts\utils\security\apply_encrytion_util.py", line 25, in create_token
exp = datetime.now(timezone.utc) + timedelta(minutes=age)
TypeError: unsupported type for timedelta minutes component: str
2023-03-22 18:40:45 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:55:23 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:57:14 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 18:59:39 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 19:02:32 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 19:02:59 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
2023-03-22 19:06:01 - INFO - [MainThread:<module>(): 37] - App Starting at 0.0.0.0:8671
from fastapi import APIRouter, HTTPException, status from typing import Union
from fastapi import APIRouter, HTTPException, status, Depends
from scripts.constants.api import ApiEndPoints from scripts.constants.api import ApiEndPoints
from scripts.core.handlers.login_handler import LoginHandlers from scripts.core.handlers.login_handler import LoginHandlers
from scripts.logging.logger import logger from scripts.logging.logger import logger
from scripts.schemas.login_schema import LoginRequest from scripts.schemas.login_schema import LoginRequest
from scripts.utils.security.decorators import MetaInfoSchema, auth
# creating the login api # creating the login api
router = APIRouter(prefix=ApiEndPoints.version) router = APIRouter(prefix=ApiEndPoints.version)
...@@ -11,20 +14,22 @@ router = APIRouter(prefix=ApiEndPoints.version) ...@@ -11,20 +14,22 @@ router = APIRouter(prefix=ApiEndPoints.version)
obj_login_handler = LoginHandlers() obj_login_handler = LoginHandlers()
@router.routes(ApiEndPoints.asset_manager_submit) @router.post(ApiEndPoints.asset_manager_submit)
async def login_default(request: LoginRequest): async def login_default(
user_data: LoginRequest, request: MetaInfoSchema = Depends(auth)
):
try: try:
# v1 # v1
if request.login_type == "normal": if user_data.login_type == "normal":
return obj_login_handler.normal_login(request) return obj_login_handler.normal_login(user_data, request)
# v1 # v1
elif request.login_type == "google": elif user_data.login_type == "google":
return obj_login_handler.google_login(request) return obj_login_handler.google_login(user_data)
# v2 # v2
elif request.login_type == "microsoft": elif user_data.login_type == "microsoft":
return obj_login_handler.microsoft_login(request) return obj_login_handler.microsoft_login(user_data)
else: else:
return HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Request") return HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Request")
...@@ -32,6 +37,7 @@ async def login_default(request: LoginRequest): ...@@ -32,6 +37,7 @@ async def login_default(request: LoginRequest):
logger.exception(e) logger.exception(e)
@router.routes(ApiEndPoints.asset_manager_user_registration) # TODO user register
@router.post(ApiEndPoints.asset_manager_user_registration)
async def user_register(): async def user_register():
return {"message": "Available soon"} return {"message": "Available soon"}
import uuid
from datetime import datetime, timedelta, timezone
from scripts.config import Secrets
from scripts.database.redis.redis_conn import login_db
from scripts.utils.security.jwt_util import JWT
jwt = JWT()
def create_token(
user_id,
ip,
age=Secrets.ACCESS_TOKEN_EXPIRE_MINUTES,
project_id=None,
):
"""
This method is to create a cookie
"""
payload = {"ip": ip, "user_id": user_id, "token": Secrets.SECRET_KEY, "age": age}
if project_id:
payload["project_id"] = project_id
exp = datetime.now() + timedelta(minutes=age)
_extras = {"iss": Secrets.issuer, "exp": exp}
_payload = payload | _extras
new_token = jwt.encode(_payload)
# Add session to redis
login_db.set(user_id, new_token)
login_db.expire(user_id, timedelta(minutes=age))
return user_id
from fastapi import HTTPException, Request, Response, status
from fastapi.openapi.models import APIKey, APIKeyIn
from fastapi.security import APIKeyCookie
from fastapi.security.api_key import APIKeyBase
from pydantic import BaseModel, Field
from scripts.config import Services
from scripts.database.redis.redis_conn import login_db
from scripts.errors import ErrorMessages
from scripts.logging.logger import logger
from scripts.utils.security.jwt_util import JWT
class MetaInfoSchema(BaseModel):
project_id: str = ""
user_id: str = ""
ip_address: str = ""
login_type: str = ""
login_token: str = Field(alias="login-token")
class Config:
allow_population_by_field_name = True
class _CookieAuthentication(APIKeyBase):
"""
Authentication backend using a cookie.
Internally, uses a JWT token to store the data.
"""
scheme: APIKeyCookie
cookie_name: str
cookie_secure: bool
def __init__(
self,
cookie_name: str = "login-token",
):
super().__init__()
self.model: APIKey = APIKey(**{"in": APIKeyIn.cookie}, name=cookie_name)
self.scheme_name = self.__class__.__name__
self.cookie_name = cookie_name
self.scheme = APIKeyCookie(name=self.cookie_name, auto_error=False)
self.login_redis = login_db
self.jwt = JWT()
def __call__(self, request: Request, response: Response) -> MetaInfoSchema:
cookies = request.cookies
login_token = cookies.get(self.cookie_name) or request.headers.get(
self.cookie_name
)
if not login_token or login_token != Services.PROJECT_NAME:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
if login_token == Services.PROJECT_NAME:
return MetaInfoSchema(
project_id=Services.PROJECT_ID,
ip_address=request.client.host, # type: ignore
login_token=cookies.get("login-token"),
)
jwt_token = self.login_redis.get(login_token)
if not jwt_token:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
try:
decoded_token = self.jwt.validate(token=jwt_token)
if not decoded_token:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
except Exception as e:
logger.exception(e)
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ErrorMessages.UNKNOWN_ERROR,
)
user_id = decoded_token.get("user_id")
project_id = decoded_token.get("project_id")
if not user_id or not project_id:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Token doesn't have required fields",
)
return MetaInfoSchema(
project_id=project_id,
user_id=user_id,
ip_address=request.client.host, # type: ignore
login_token=cookies.get("login-token"),
)
CookieAuthentication = auth = _CookieAuthentication()
import logging
import jwt
from scripts.config import Secrets
class JWT:
def __init__(self) -> None:
self.max_login_age: int = Secrets.ACCESS_TOKEN_EXPIRE_MINUTES
# self.issuer: str = Secrets.issuer
self.alg: str = Secrets.ALGORITHM
self.key = Secrets.SECRET_KEY
def encode(self, payload) -> str:
try:
return jwt.encode(payload, self.key, algorithm=self.alg)
except Exception as e:
logging.exception(f"Exception while encoding JWT: {str(e)}")
raise
def decode(self, token):
try:
return jwt.decode(token, self.key, algorithms=self.alg)
except Exception as e:
logging.exception(f"Exception while encoding JWT: {str(e)}")
raise
def validate(self, token):
try:
return jwt.decode(
token,
self.key,
algorithms=self.alg
)
except Exception as e:
logging.exception(f"Exception while validating JWT: {str(e)}")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment