from collections import OrderedDict from dotenv import load_dotenv from fastapi import FastAPI from fastapi.responses import RedirectResponse from uuid import uuid4 from urllib.parse import urlencode from typing import Union import requests import os load_dotenv() client_id = os.environ['MONZO_CLIENT_ID'] client_secret = os.environ['MONZO_CLIENT_SECRET'] callback_uri = os.environ['MONZO_CALLBACK_URI'] app = FastAPI() @app.get("/") def read_root(): return {"version": "v0.0.4"} @app.get("/redirect", response_class=RedirectResponse) def read_redirect(): state = uuid4() # TODO: store state in a cookie to check it later query = urlencode(OrderedDict( client_id=client_id, redirect_uri=callback_uri, state=state, response_type="code", )) return f"https://auth.monzo.com/?{query}" @app.get("/callback") def read_callback(code: str, state: str): # TODO: check the state with the user's cookie data = { 'grant_type': 'authorization_code', 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': callback_uri, 'code': code, } response = requests.post("https://api.monzo.com/oauth2/token", data=data) return response.json() @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}