From 7b400dc7efea9f40b4a6af9a86ab89dbd228db87 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 16 Jan 2021 12:38:17 +0100 Subject: [PATCH] added authorization: - create/delete device --- src/Dependencies.py | 13 +++++++++++++ src/main.py | 8 +++++--- src/routers/DeviceRouter.py | 12 +++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Dependencies.py b/src/Dependencies.py index a96609f..022aee1 100644 --- a/src/Dependencies.py +++ b/src/Dependencies.py @@ -1,3 +1,7 @@ +from fastapi import Security, HTTPException +from fastapi.security import APIKeyHeader +from starlette.status import HTTP_403_FORBIDDEN + from logic.databaseNew.Database import SessionLocal @@ -7,3 +11,12 @@ def get_database(): yield db finally: db.close() + + +API_KEY_HEADER = APIKeyHeader(name='apiKey') + + +async def check_api_key(apiKey: str = Security(API_KEY_HEADER)): + from main import API_KEY + if apiKey != API_KEY: + raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail='apiKey invalid') diff --git a/src/main.py b/src/main.py index a6ca603..90aa9e7 100644 --- a/src/main.py +++ b/src/main.py @@ -14,13 +14,15 @@ Models.Base.metadata.create_all(bind=engine) with open('version.json', 'r', encoding='UTF-8') as f: version = json.load(f)['version'] +with open('../settings.json', 'r', encoding='UTF-8') as f: + settings = json.load(f) + +API_KEY = settings['api']['key'] + app = FastAPI(title=Constants.APP_NAME, version=version['name'], description='The StorageLeaf API') app.include_router(DeviceRouter.router) -with open('../settings.json', 'r', encoding='UTF-8') as f: - settings = json.load(f) - if __name__ == '__main__': uvicorn.run(app, host=settings['server']['listen'], port=settings['server']['port']) diff --git a/src/routers/DeviceRouter.py b/src/routers/DeviceRouter.py index 4b509e9..9471e50 100644 --- a/src/routers/DeviceRouter.py +++ b/src/routers/DeviceRouter.py @@ -3,7 +3,7 @@ from typing import List from fastapi import APIRouter, HTTPException, Depends from sqlalchemy.orm import Session -from Dependencies import get_database +from Dependencies import get_database, check_api_key from logic.databaseNew import Schemas, Crud from logic.databaseNew.Schemas import Status @@ -32,8 +32,9 @@ async def read_device(deviceId: int, db: Session = Depends(get_database)): @router.post('/', response_model=Schemas.Device, summary='Adds a new device', - responses={400: {'description': 'Device with this name already exists'}}) -async def create_user(device: Schemas.DeviceCreate, db: Session = Depends(get_database)): + responses={400: {'description': 'Device with this name already exists'}}, + dependencies=[Depends(check_api_key)]) +async def create_device(device: Schemas.DeviceCreate, db: Session = Depends(get_database)): createdDevice = Crud.get_device_by_name(db, device.name) if createdDevice: raise HTTPException(status_code=400, detail='Device with this name already exists') @@ -42,8 +43,9 @@ async def create_user(device: Schemas.DeviceCreate, db: Session = Depends(get_da @router.delete('/{deviceId}', response_model=Status, summary='Gets a specific device', - responses={404: {'description': 'Device not found'}}) -async def read_device(deviceId: int, db: Session = Depends(get_database)): + responses={404: {'description': 'Device not found'}}, + dependencies=[Depends(check_api_key)]) +async def delete_device(deviceId: int, db: Session = Depends(get_database)): device = Crud.get_device(db, deviceId=deviceId) if device is None: raise HTTPException(status_code=404, detail='Device not found') -- GitLab