del fastapi-users

This commit is contained in:
2025-07-16 17:01:10 +03:00
parent db3a2c7010
commit 87b1646f85
8 changed files with 149 additions and 169 deletions

View File

@ -1,13 +1,13 @@
import asyncio
from fastapi import Depends, FastAPI, HTTPException, Request
from fastapi.responses import RedirectResponse
from database.db import Database
import uvicorn
from src.database.schemas import *
from src.auth.transport import Transport
from src.database.user import User
from contextlib import asynccontextmanager
app = FastAPI(title='sclient-main-server')
from authx import AuthXConfig, AuthX, RequestToken
from fastapi import Response, FastAPI, Request, HTTPException, Depends
from fastapi.responses import RedirectResponse
import uvicorn
from src.database.db import Database
from src.database.user import User, UserLogin
### Settings
# TODO: Create .env
@ -18,74 +18,80 @@ ADMIN_PASSWORD = 'admin'
DATABASE_USER = 'ADMIN'
DATABASE_PASS = '123123'
DATABASE_HOST = '127.0.0.1'
DATABASE_PORT = 5432
DATABASE_NAME = 'sonoma-db'
SECRET = 'SECRET'
###
db = Database(
DATABASE_USER,
DATABASE_PASS,
DATABASE_HOST,
DATABASE_PORT,
DATABASE_NAME,
SECRET
)
@asynccontextmanager
async def lifespan(app: FastAPI):
await db.connect()
await db.init()
yield
await db.disconnect()
db = Database(
ADMIN_NAME,
ADMIN_PASSWORD,
DATABASE_USER,
DATABASE_PASS,
DATABASE_HOST,
DATABASE_NAME
)
app = FastAPI(title='sclient-main-server', lifespan=lifespan)
config = AuthXConfig()
config.JWT_SECRET_KEY = SECRET
config.JWT_ACCESS_COOKIE_NAME = "sclient_access_token"
config.JWT_TOKEN_LOCATION = ["cookies"]
security = AuthX(config=config)
security.handle_errors(app)
transport = Transport(SECRET, db)
class App:
def init(self, loop) -> None:
config = uvicorn.Config(
app,
loop=loop,
host='0.0.0.0',
port=PORT
)
server = uvicorn.Server(config)
loop.run_until_complete(server.serve())
@app.get('/')
async def docs(self: Request):
return RedirectResponse(f'{self.url}docs')
@app.get("/authenticated-route")
async def authenticated_route(user: User = Depends(transport.current_active_user)):
return {"message": f"Hello {user.email}!"}
### Auth
@app.post('/login')
async def login(self: Request, credentials: UserLogin, response: Response):
user = await db.get_user(credentials.username)
if user is not None:
if user[1] == credentials.password:
token = security.create_access_token(uid=credentials.username)
response.set_cookie(config.JWT_ACCESS_COOKIE_NAME, token)
return {
"access_token": token
}
raise HTTPException(
401,
detail='Incorrect username or password'
)
###
### Protected
@app.get('/protected/auth', dependencies=[Depends(security.access_token_required)])
async def auth(self: Request):
try:
return {"message": "Hello world !"}
except Exception as e:
raise HTTPException(
401,
detail={"message": str(e)}
) from e
###
def main():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
server = App()
app.include_router(
transport.fastapi_users.get_auth_router(transport.auth_backend), prefix="/auth/jwt", tags=["auth"]
)
app.include_router(
transport.fastapi_users.get_register_router(UserRead, UserCreate),
prefix="/auth",
tags=["auth"],
)
app.include_router(
transport.fastapi_users.get_reset_password_router(),
prefix="/auth",
tags=["auth"],
)
app.include_router(
transport.fastapi_users.get_verify_router(UserRead),
prefix="/auth",
tags=["auth"],
)
app.include_router(
transport.fastapi_users.get_users_router(UserRead, UserUpdate),
prefix="/users",
tags=["users"],
)
loop.run_until_complete(db.create_db_and_tables())
server.init(loop)
uvicorn.run(app, host='0.0.0.0', port=PORT)
if __name__ == '__main__':
main()