mazda_webservice.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import json
  2. import os
  3. from dataclasses import dataclass
  4. from flask import Flask, redirect, request, session
  5. from oauthlib.oauth2.rfc6749.errors import OAuth2Error
  6. from requests_oauthlib import OAuth2Session
  7. import mazda_upload
  8. # from datetime import datetime
  9. @dataclass
  10. class Token:
  11. access_token: str
  12. token_type: str
  13. refresh_token: str
  14. expires_in: int
  15. sub: str
  16. iss: str
  17. iat: int
  18. defaultDomain: str
  19. userGuid: str
  20. organisations: list[str]
  21. jti: str
  22. scope: list[str]
  23. expires_at: float
  24. app = Flask(__name__)
  25. PROD = True
  26. cfg: mazda_upload.MazdaConfig = mazda_upload.cfg_prod if PROD else mazda_upload.cfg_debug
  27. base_dir = "C:/projekte/mazda/"
  28. def token_save(token):
  29. session["oauth_token"] = token
  30. with open(base_dir + "temp/token.json", "w") as fwh:
  31. json.dump(token, fwh, indent=2)
  32. def token_load() -> Token:
  33. try:
  34. with open(base_dir + "temp/token.json", "r") as frh:
  35. return json.load(frh)
  36. except FileNotFoundError:
  37. return None
  38. def get_token() -> Token:
  39. if session.get("oauth_token") is None:
  40. session["oauth_token"] = token_load()
  41. # if session["oauth_token"] is not None and session["oauth_token"]["expires_at"] < datetime.now().timestamp():
  42. # session["oauth_token"] = None
  43. return session["oauth_token"]
  44. @app.route("/")
  45. def home():
  46. token = get_token()
  47. access_token = token.get("access_token", "") if token else ""
  48. oauth = OAuth2Session(cfg.client_id, token=token, auto_refresh_kwargs={"grant_type": "refresh_token"})
  49. token_save(oauth.token)
  50. if session["oauth_token"].get("access_token", "???") != access_token:
  51. print("oh")
  52. if not oauth.authorized:
  53. token = get_token()
  54. new_token = oauth.refresh_token(token.iss, token.refresh_token)
  55. print("Blubb.")
  56. token_save(new_token)
  57. if oauth.authorized:
  58. return redirect("/profile")
  59. return redirect("/login")
  60. @app.route("/refresh")
  61. def refresh():
  62. oauth = OAuth2Session(cfg.client_id)
  63. if oauth.authorized:
  64. return redirect("/profile")
  65. return redirect("/")
  66. @app.route("/login")
  67. def login():
  68. redirect_uri = request.base_url.rsplit("/", 1)[0] + "/callback"
  69. print(redirect_uri)
  70. oauth = OAuth2Session(cfg.client_id, redirect_uri=redirect_uri)
  71. authorization_url, state = oauth.authorization_url(cfg.domain + cfg.auth_url)
  72. session["oauth_state"] = state
  73. return redirect(authorization_url)
  74. @app.route("/callback", methods=["GET"])
  75. def callback():
  76. state = session.get("oauth_state")
  77. if state is None:
  78. return redirect("/")
  79. print(state)
  80. redirect_uri = request.base_url
  81. print(redirect_uri)
  82. oauth = OAuth2Session(cfg.client_id, state=state, redirect_uri=redirect_uri)
  83. try:
  84. token = oauth.fetch_token(
  85. cfg.domain + cfg.token_url, client_secret=cfg.client_secret, authorization_response=request.url
  86. )
  87. token_save(token)
  88. session["oauth_token"] = token
  89. return redirect("/profile")
  90. except OAuth2Error as e:
  91. print(e)
  92. return redirect("/")
  93. @app.route("/profile", methods=["GET"])
  94. def profile():
  95. oauth = OAuth2Session(cfg.client_id, token=get_token(), auto_refresh_kwargs={"grant_type": "refresh_token"})
  96. if not oauth.authorized:
  97. return redirect("/")
  98. try:
  99. res = mazda_upload.upload_files(cfg, oauth)
  100. except OAuth2Error as e:
  101. print(e.error, e.description)
  102. return redirect("/")
  103. return app.response_class(response=json.dumps(res, indent=2), mimetype="application/json")
  104. if __name__ == "__main__":
  105. # os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = "1"
  106. app.secret_key = os.urandom(24)
  107. app.run(
  108. host="0.0.0.0",
  109. port="8085",
  110. ssl_context=(
  111. "config/cert/global-cube.com.crt",
  112. "config/cert/global-cube.com.key",
  113. # "config/cert/intermediate.crt",
  114. ),
  115. debug=True,
  116. )