mazda_webservice2.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import base64
  2. import os
  3. import requests
  4. from flask import Flask, redirect, request, session
  5. app = Flask(__name__)
  6. app.secret_key = os.urandom(24)
  7. # Mazda OAuth2 configuration
  8. CLIENT_ID = "YOUR_CLIENT_ID"
  9. CLIENT_SECRET = "YOUR_CLIENT_SECRET"
  10. AUTHORIZATION_BASE_URL = "https://mappsacc.mazdaeur.com/oauth/authorize"
  11. TOKEN_URL = "https://mappsacc.mazdaeur.com/oauth/token"
  12. REDIRECT_URI = "http://localhost:5000/callback"
  13. @app.route("/")
  14. def home():
  15. return '<a href="/login">Login with Mazda</a>'
  16. @app.route("/login")
  17. def login():
  18. state = os.urandom(8).hex()
  19. session["oauth_state"] = state
  20. auth_url = (
  21. f"{AUTHORIZATION_BASE_URL}?response_type=code"
  22. f"&client_id={CLIENT_ID}"
  23. f"&redirect_uri={REDIRECT_URI}"
  24. f"&state={state}"
  25. )
  26. return redirect(auth_url)
  27. @app.route("/callback")
  28. def callback():
  29. code = request.args.get("code")
  30. state = request.args.get("state")
  31. if state != session.get("oauth_state"):
  32. return "State mismatch. Possible CSRF attack.", 400
  33. # Exchange code for token
  34. auth = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode()
  35. headers = {"Authorization": f"Basic {auth}", "Content-Type": "application/x-www-form-urlencoded"}
  36. data = {"grant_type": "authorization_code", "code": code, "redirect_uri": REDIRECT_URI}
  37. response = requests.post(TOKEN_URL, headers=headers, data=data)
  38. token_data = response.json()
  39. session["access_token"] = token_data.get("access_token")
  40. session["refresh_token"] = token_data.get("refresh_token")
  41. return f"Access Token: {session['access_token']}<br>Refresh Token: {session['refresh_token']}"
  42. @app.route("/refresh")
  43. def refresh_token():
  44. refresh_token = session.get("refresh_token")
  45. if not refresh_token:
  46. return "No refresh token available.", 400
  47. auth = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode()
  48. headers = {"Authorization": f"Basic {auth}", "Content-Type": "application/x-www-form-urlencoded"}
  49. data = {"grant_type": "refresh_token", "refresh_token": refresh_token}
  50. response = requests.post(TOKEN_URL, headers=headers, data=data)
  51. token_data = response.json()
  52. session["access_token"] = token_data.get("access_token")
  53. session["refresh_token"] = token_data.get("refresh_token")
  54. return f"New Access Token: {session['access_token']}"
  55. if __name__ == "__main__":
  56. app.run(
  57. host="0.0.0.0",
  58. port="5000",
  59. ssl_context=(
  60. "config/cert/global-cube.com.crt",
  61. "config/cert/global-cube.com.key",
  62. # "config/cert/intermediate.crt",
  63. ),
  64. debug=True,
  65. )