aboutsummaryrefslogtreecommitdiffstats
path: root/backend/routes/auth/authorize.py
blob: 5de49f51238acbb11ac3b8d6ec7830dc911e96e3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""
Use a token received from the Discord OAuth2 system to fetch user information.
"""

import jwt
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


class AuthorizeRoute(Route):
    """
    Use the authorization code from Discord to generate a JWT token.
    """

    name = "authorize"
    path = "/authorize"

    async def post(self, request: Request) -> JSONResponse:
        data = await request.json()

        bearer_token = await fetch_bearer_token(data["token"])
        user_details = await fetch_user_details(bearer_token["access_token"])

        user_details["admin"] = request.state.db.admins.find_one(
            {"_id": user_details["id"]}
        ) is not None

        token = jwt.encode(user_details, SECRET_KEY, algorithm="HS256")

        return JSONResponse({
            "token": token.decode()
        })