123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- from dataclasses import dataclass
- from requests_oauthlib import OAuth2Session
- from oauthlib.oauth2.rfc6749.errors import OAuth2Error
- from flask import Flask, redirect, request, session
- from datetime import datetime
- import json
- import os
- import mazda_upload
- @dataclass
- class Token:
- access_token: str
- token_type: str
- refresh_token: str
- expires_in: int
- sub: str
- iss: str
- iat: int
- defaultDomain: str
- userGuid: str
- organisations: list[str]
- jti: str
- scope: list[str]
- expires_at: float
- app = Flask(__name__)
- cfg: mazda_upload.MazdaConfig = mazda_upload.cfg
- base_dir = "C:/projekte/mazda/"
- def token_save(token):
- session["oauth_token"] = token
- with open(base_dir + "temp/token.json", "w") as fwh:
- json.dump(token, fwh, indent=2)
- def token_load() -> Token:
- try:
- with open(base_dir + "temp/token.json", "r") as frh:
- return json.load(frh)
- except FileNotFoundError:
- return None
- def get_token() -> Token:
- if session.get("oauth_token") is None:
- session["oauth_token"] = token_load()
- if session["oauth_token"] is not None and session["oauth_token"]["expires_at"] < datetime.now().timestamp():
- session["oauth_token"] = None
- return session["oauth_token"]
- @app.route("/")
- def demo():
- # if token := get_token() is not None:
- oauth = OAuth2Session(cfg.client_id, token=get_token())
- if oauth.authorized:
- return redirect("/profile")
- return redirect("/login")
- @app.route("/login")
- def login():
- redirect_uri = request.base_url.rsplit("/", 1)[0] + "/callback"
- print(redirect_uri)
- oauth = OAuth2Session(cfg.client_id, redirect_uri=redirect_uri)
- authorization_url, state = oauth.authorization_url(cfg.domain + cfg.auth_url)
- session["oauth_state"] = state
- return redirect(authorization_url)
- @app.route("/callback", methods=["GET"])
- def callback():
- state = session.get("oauth_state")
- if state is None:
- return redirect("/")
- print(state)
- redirect_uri = request.base_url
- print(redirect_uri)
- oauth = OAuth2Session(cfg.client_id, state=state, redirect_uri=redirect_uri)
- try:
- token = oauth.fetch_token(
- cfg.domain + cfg.token_url, client_secret=cfg.client_secret, authorization_response=request.url
- )
- token_save(token)
- session["oauth_token"] = token
- return redirect("/profile")
- except OAuth2Error as e:
- print(e)
- return redirect("/")
- @app.route("/profile", methods=["GET"])
- def profile():
- oauth = OAuth2Session(cfg.client_id, token=get_token())
- if not oauth.authorized:
- return redirect("/")
- data = mazda_upload.convert_csv(
- base_dir + "data/Workshop_Order_Report.csv", base_dir + "temp/mazda_export.json", 2023, 12
- )
- try:
- mazda_upload.upload(oauth, data)
- except OAuth2Error:
- return redirect("/")
- return app.response_class(response=json.dumps(data, indent=2), mimetype="application/json")
- if __name__ == "__main__":
- # os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = "1"
- app.secret_key = os.urandom(24)
- app.run(
- host="0.0.0.0",
- port="8085",
- ssl_context=(
- "config/cert/global-cube.com.crt",
- "config/cert/global-cube.com.key",
- # "config/cert/intermediate.crt",
- ),
- debug=True,
- )
|