🥅 Catching OAuth-errors
This commit is contained in:
@@ -3,7 +3,7 @@ from typing import Optional
|
|||||||
import authlib.integrations.base_client
|
import authlib.integrations.base_client
|
||||||
from fastapi import APIRouter, Request, HTTPException, Response
|
from fastapi import APIRouter, Request, HTTPException, Response
|
||||||
from classquiz.config import settings
|
from classquiz.config import settings
|
||||||
|
from fastapi.responses import RedirectResponse
|
||||||
from classquiz.db.models import User, UserAuthTypes
|
from classquiz.db.models import User, UserAuthTypes
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from classquiz.auth import check_token
|
from classquiz.auth import check_token
|
||||||
@@ -26,6 +26,7 @@ class Plan(BaseModel):
|
|||||||
class GitHubOauthResponse(BaseModel):
|
class GitHubOauthResponse(BaseModel):
|
||||||
login: str
|
login: str
|
||||||
id: int
|
id: int
|
||||||
|
email: Optional[str]
|
||||||
node_id: Optional[str]
|
node_id: Optional[str]
|
||||||
avatar_url: Optional[str]
|
avatar_url: Optional[str]
|
||||||
gravatar_id: Optional[str]
|
gravatar_id: Optional[str]
|
||||||
@@ -46,7 +47,6 @@ class GitHubOauthResponse(BaseModel):
|
|||||||
company: Optional[str]
|
company: Optional[str]
|
||||||
blog: Optional[str]
|
blog: Optional[str]
|
||||||
location: Optional[str]
|
location: Optional[str]
|
||||||
email: str
|
|
||||||
hireable: Optional[bool]
|
hireable: Optional[bool]
|
||||||
bio: Optional[str]
|
bio: Optional[str]
|
||||||
twitter_username: Optional[str]
|
twitter_username: Optional[str]
|
||||||
@@ -92,9 +92,11 @@ async def auth(request: Request, response: Response):
|
|||||||
try:
|
try:
|
||||||
token = await oauth.github.authorize_access_token(request)
|
token = await oauth.github.authorize_access_token(request)
|
||||||
except authlib.integrations.base_client.OAuthError:
|
except authlib.integrations.base_client.OAuthError:
|
||||||
raise HTTPException(status_code=401, detail="The OAuth didn't work! :(")
|
return RedirectResponse("/account/oauth-error")
|
||||||
resp = await oauth.github.get("user", token=token)
|
resp = await oauth.github.get("user", token=token)
|
||||||
user_data = GitHubOauthResponse(**resp.json())
|
user_data = GitHubOauthResponse(**resp.json())
|
||||||
|
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)
|
user_in_db = await User.objects.get_or_none(email=user_data.email)
|
||||||
if user_in_db is None:
|
if user_in_db is None:
|
||||||
# REGISTER USER
|
# REGISTER USER
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<script lang="ts" context="module">
|
||||||
|
export async function load({ url }) {
|
||||||
|
const error = url.searchParams.get('error');
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
error
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export let error: string;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="flex justify-center w-full">
|
||||||
|
<h1 class="text-6xl">Error authenticating</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-center w-full pt-10">
|
||||||
|
<p>
|
||||||
|
{#if error === 'email'}
|
||||||
|
GitHub didn't respond with an email-address. Are you sure your email-address is
|
||||||
|
verified?
|
||||||
|
{:else}
|
||||||
|
There was an error authenticating you. Are you sure you've got an email? Is the
|
||||||
|
Email verified?
|
||||||
|
{/if}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-center w-full pt-10">
|
||||||
|
<a
|
||||||
|
href="/account/login"
|
||||||
|
class="px-4 py-2 leading-5 text-black dark:text-white transition-colors duration-200 transform bg-gray-50 dark:bg-gray-700 rounded text-center hover:bg-gray-600 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
|
||||||
|
>
|
||||||
|
Go back to login-page
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-center w-full pt-10">
|
||||||
|
<p>
|
||||||
|
If the error persists, please open an <a
|
||||||
|
href="https://github.com/mawoka-myblock/ClassQuiz/issues/new?assignees=&labels=&template=Bug_report.md"
|
||||||
|
class="underline transition hover:text-blue-300">issue on GitHub</a
|
||||||
|
>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user