Compare commits
2 commits
faba0fd14f
...
04351888a8
Author | SHA1 | Date | |
---|---|---|---|
04351888a8 | |||
832623044f |
|
@ -1,30 +1,19 @@
|
|||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import FastAPI, status
|
||||
from fastapi.responses import RedirectResponse, HTMLResponse
|
||||
from fastapi import FastAPI
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from starlette.middleware.sessions import SessionMiddleware
|
||||
from starlette.requests import Request
|
||||
from authlib.integrations.starlette_client import OAuth, OAuthError
|
||||
from pydantic import BaseModel
|
||||
import json
|
||||
|
||||
|
||||
import hellocomputer
|
||||
|
||||
from .routers import analysis, files, sessions
|
||||
from .config import settings
|
||||
from .routers import analysis, auth, files, sessions, health
|
||||
|
||||
static_path = Path(hellocomputer.__file__).parent / "static"
|
||||
|
||||
oauth = OAuth()
|
||||
oauth.register(
|
||||
"auth0",
|
||||
client_id=settings.auth0_client_id,
|
||||
client_secret=settings.auth0_client_secret,
|
||||
client_kwargs={"scope": "openid profile email", "verify": False},
|
||||
server_metadata_url=f"https://{settings.auth0_domain}/.well-known/openid-configuration",
|
||||
)
|
||||
app = FastAPI()
|
||||
app.add_middleware(SessionMiddleware, secret_key=settings.app_secret_key)
|
||||
|
||||
|
@ -40,69 +29,11 @@ async def homepage(request: Request):
|
|||
return HTMLResponse(f.read())
|
||||
|
||||
|
||||
@app.route("/login")
|
||||
async def login(request: Request):
|
||||
return await oauth.auth0.authorize_redirect(
|
||||
request,
|
||||
redirect_uri=f"{settings.base_url}/callback",
|
||||
)
|
||||
|
||||
|
||||
@app.route("/callback", methods=["GET", "POST"])
|
||||
async def callback(request: Request):
|
||||
try:
|
||||
token = await oauth.auth0.authorize_access_token(request)
|
||||
except OAuthError as error:
|
||||
return HTMLResponse(f"<h1>{error.error}</h1>")
|
||||
user = token.get("userinfo")
|
||||
if user:
|
||||
request.session["user"] = dict(user)
|
||||
|
||||
return RedirectResponse(url="/app")
|
||||
|
||||
|
||||
@app.route("/logout")
|
||||
async def logout(request: Request):
|
||||
request.session.pop("user", None)
|
||||
return RedirectResponse(url="/")
|
||||
|
||||
|
||||
@app.route("/user")
|
||||
async def user(request: Request):
|
||||
user = request.session.get("user")
|
||||
return user
|
||||
|
||||
|
||||
class HealthCheck(BaseModel):
|
||||
"""Response model to validate and return when performing a health check."""
|
||||
|
||||
status: str = "OK"
|
||||
|
||||
|
||||
@app.get(
|
||||
"/health",
|
||||
tags=["healthcheck"],
|
||||
summary="Perform a Health Check",
|
||||
response_description="Return HTTP Status Code 200 (OK)",
|
||||
status_code=status.HTTP_200_OK,
|
||||
response_model=HealthCheck,
|
||||
)
|
||||
def get_health() -> HealthCheck:
|
||||
"""
|
||||
## Perform a Health Check
|
||||
Endpoint to perform a healthcheck on. This endpoint can primarily be used Docker
|
||||
to ensure a robust container orchestration and management is in place. Other
|
||||
services which rely on proper functioning of the API service will not deploy if this
|
||||
endpoint returns any other HTTP status code except 200 (OK).
|
||||
Returns:
|
||||
HealthCheck: Returns a JSON response with the health status
|
||||
"""
|
||||
return HealthCheck(status="OK")
|
||||
|
||||
|
||||
app.include_router(health.router)
|
||||
app.include_router(sessions.router)
|
||||
app.include_router(files.router)
|
||||
app.include_router(analysis.router)
|
||||
app.include_router(auth.router)
|
||||
app.mount(
|
||||
"/app",
|
||||
StaticFiles(directory=static_path, html=True),
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import os
|
||||
|
||||
from fastapi import APIRouter
|
||||
from fastapi.responses import PlainTextResponse
|
||||
|
||||
|
|
50
src/hellocomputer/routers/auth.py
Normal file
50
src/hellocomputer/routers/auth.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
from authlib.integrations.starlette_client import OAuth, OAuthError
|
||||
from fastapi import APIRouter
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from starlette.requests import Request
|
||||
|
||||
from ..config import settings
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
oauth = OAuth()
|
||||
oauth.register(
|
||||
"auth0",
|
||||
client_id=settings.auth0_client_id,
|
||||
client_secret=settings.auth0_client_secret,
|
||||
client_kwargs={"scope": "openid profile email", "verify": False},
|
||||
server_metadata_url=f"https://{settings.auth0_domain}/.well-known/openid-configuration",
|
||||
)
|
||||
|
||||
|
||||
@router.get("/login")
|
||||
async def login(request: Request):
|
||||
return await oauth.auth0.authorize_redirect(
|
||||
request,
|
||||
redirect_uri=f"{settings.base_url}/callback",
|
||||
)
|
||||
|
||||
|
||||
@router.route("/callback", methods=["GET", "POST"])
|
||||
async def callback(request: Request):
|
||||
try:
|
||||
token = await oauth.auth0.authorize_access_token(request)
|
||||
except OAuthError as error:
|
||||
return HTMLResponse(f"<h1>{error.error}</h1>")
|
||||
user = token.get("userinfo")
|
||||
if user:
|
||||
request.session["user"] = dict(user)
|
||||
|
||||
return RedirectResponse(url="/app")
|
||||
|
||||
|
||||
@router.get("/logout")
|
||||
async def logout(request: Request):
|
||||
request.session.pop("user", None)
|
||||
return RedirectResponse(url="/")
|
||||
|
||||
|
||||
@router.get("/user")
|
||||
async def user(request: Request):
|
||||
user = request.session.get("user")
|
||||
return user
|
31
src/hellocomputer/routers/health.py
Normal file
31
src/hellocomputer/routers/health.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
from fastapi import APIRouter, status
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
class HealthCheck(BaseModel):
|
||||
"""Response model to validate and return when performing a health check."""
|
||||
|
||||
status: str = "OK"
|
||||
|
||||
|
||||
@router.get(
|
||||
"/health",
|
||||
tags=["healthcheck"],
|
||||
summary="Perform a Health Check",
|
||||
response_description="Return HTTP Status Code 200 (OK)",
|
||||
status_code=status.HTTP_200_OK,
|
||||
response_model=HealthCheck,
|
||||
)
|
||||
def get_health() -> HealthCheck:
|
||||
"""
|
||||
## Perform a Health Check
|
||||
Endpoint to perform a healthcheck on. This endpoint can primarily be used Docker
|
||||
to ensure a robust container orchestration and management is in place. Other
|
||||
services which rely on proper functioning of the API service will not deploy if this
|
||||
endpoint returns any other HTTP status code except 200 (OK).
|
||||
Returns:
|
||||
HealthCheck: Returns a JSON response with the health status
|
||||
"""
|
||||
return HealthCheck(status="OK")
|
|
@ -1,9 +1,8 @@
|
|||
from uuid import uuid4
|
||||
|
||||
from fastapi import APIRouter
|
||||
from starlette.requests import Request
|
||||
from fastapi.responses import PlainTextResponse
|
||||
|
||||
from starlette.requests import Request
|
||||
|
||||
# Scheme for the Authorization header
|
||||
|
||||
|
|
Loading…
Reference in a new issue