diff options
author | 2020-12-16 23:26:52 +0000 | |
---|---|---|
committer | 2020-12-16 23:26:52 +0000 | |
commit | 00fae00e16e4732e4ebe5a869e3b8c0a8398f9ae (patch) | |
tree | 2623eb0ced251cc23d0e6d5a907e3d5e51ab0f83 /backend/routes | |
parent | Document forms routes (diff) |
Document auth route
Diffstat (limited to 'backend/routes')
-rw-r--r-- | backend/routes/auth/authorize.py | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/backend/routes/auth/authorize.py b/backend/routes/auth/authorize.py index 41c0a0b..2509109 100644 --- a/backend/routes/auth/authorize.py +++ b/backend/routes/auth/authorize.py @@ -2,13 +2,26 @@ Use a token received from the Discord OAuth2 system to fetch user information. """ +import httpx import jwt +from pydantic.fields import Field +from pydantic.main import BaseModel +from spectree.response import Response from starlette.requests import Request from starlette.responses import JSONResponse from backend.constants import SECRET_KEY from backend.route import Route from backend.discord import fetch_bearer_token, fetch_user_details +from backend.validation import ErrorMessage, api + + +class AuthorizeRequest(BaseModel): + token: str = Field(description="The access token received from Discord.") + + +class AuthorizeResponse(BaseModel): + token: str = Field(description="A JWT token containing the user information") class AuthorizeRoute(Route): @@ -19,11 +32,22 @@ class AuthorizeRoute(Route): name = "authorize" path = "/authorize" + @api.validate( + json=AuthorizeRequest, + resp=Response(HTTP_200=AuthorizeResponse, HTTP_400=ErrorMessage), + tags=["auth"] + ) async def post(self, request: Request) -> JSONResponse: + """Generate an authorization token.""" data = await request.json() - bearer_token = await fetch_bearer_token(data["token"]) - user_details = await fetch_user_details(bearer_token["access_token"]) + try: + bearer_token = await fetch_bearer_token(data["token"]) + user_details = await fetch_user_details(bearer_token["access_token"]) + except httpx.HTTPStatusError: + return JSONResponse({ + "error": "auth_failure" + }, status_code=400) user_details["admin"] = await request.state.db.admins.find_one( {"_id": user_details["id"]} |