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()
})
|