mazda_webservice.py 3.6 KB

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