diff --git a/classquiz/oauth/github.py b/classquiz/oauth/github.py index c95a618..3d0f53b 100644 --- a/classquiz/oauth/github.py +++ b/classquiz/oauth/github.py @@ -51,7 +51,7 @@ class GitHubOauthResponse(BaseModel): events_url: Optional[str] = None received_events_url: Optional[str] = None type: Optional[str] = None - site_admin: Optional[str] = None + site_admin: Optional[bool] = None name: Optional[str] = None company: Optional[str] = None blog: Optional[str] = None @@ -103,7 +103,8 @@ async def auth(request: Request, response: Response): except authlib.integrations.base_client.OAuthError: return RedirectResponse("/account/oauth-error") resp = await oauth.github.get("user", token=token) - user_data = GitHubOauthResponse(**resp.json()) + data = resp.json() + user_data = GitHubOauthResponse(**data) if user_data.email is None: return RedirectResponse("/account/oauth-error?error=email") user_in_db = await User.objects.get_or_none(email=user_data.email) @@ -140,7 +141,10 @@ async def auth(request: Request, response: Response): else: raise HTTPException(status_code=500, detail=str(e)) user = await User.objects.get_or_none( - email=user_data.email, username=user_data.login, auth_type=UserAuthTypes.GITHUB, verified=True + email=user_data.email, + username=user_data.login, + auth_type=UserAuthTypes.GITHUB, + verified=True, ) await log_user_in(user=user, request=request, response=response) diff --git a/classquiz/oauth/init_oauth.py b/classquiz/oauth/init_oauth.py index 2da4c8f..91c6bcf 100644 --- a/classquiz/oauth/init_oauth.py +++ b/classquiz/oauth/init_oauth.py @@ -4,15 +4,37 @@ from authlib.integrations.starlette_client import OAuth -from classquiz.config import settings +from classquiz.config import settings, redis from functools import lru_cache +import json settings = settings() +class RedisCache: + def __init__(self) -> None: + pass + + async def get(self, key: str) -> str | None: + value = await redis.get(f"authlib:{key}") + if value is None: + return None + try: + return json.loads(value) + except json.JSONDecodeError: + return value + + async def set(self, key: str, value: str, expires: int | None = None): + data = json.dumps(value) + await redis.set(f"authlib:{key}", data, ex=expires) + + async def delete(self, key: str) -> None: + await redis.delete(key) + + @lru_cache() def init_oauth() -> OAuth: - oauth = OAuth() + oauth = OAuth(cache=RedisCache()) if settings.google_client_secret is not None and settings.google_client_id is not None: oauth.register( name="google", diff --git a/frontend/src/routes/account/login/+page.svelte b/frontend/src/routes/account/login/+page.svelte index 4081249..fd88a5c 100644 --- a/frontend/src/routes/account/login/+page.svelte +++ b/frontend/src/routes/account/login/+page.svelte @@ -88,7 +88,7 @@ SPDX-License-Identifier: MPL-2.0 ClassQuiz - Login -
{#if verified} {/if}