import base64 import os import requests from flask import Flask, redirect, request, session app = Flask(__name__) app.secret_key = os.urandom(24) # Mazda OAuth2 configuration CLIENT_ID = "YOUR_CLIENT_ID" CLIENT_SECRET = "YOUR_CLIENT_SECRET" AUTHORIZATION_BASE_URL = "https://mappsacc.mazdaeur.com/oauth/authorize" TOKEN_URL = "https://mappsacc.mazdaeur.com/oauth/token" REDIRECT_URI = "http://localhost:5000/callback" @app.route("/") def home(): return 'Login with Mazda' @app.route("/login") def login(): state = os.urandom(8).hex() session["oauth_state"] = state auth_url = ( f"{AUTHORIZATION_BASE_URL}?response_type=code" f"&client_id={CLIENT_ID}" f"&redirect_uri={REDIRECT_URI}" f"&state={state}" ) return redirect(auth_url) @app.route("/callback") def callback(): code = request.args.get("code") state = request.args.get("state") if state != session.get("oauth_state"): return "State mismatch. Possible CSRF attack.", 400 # Exchange code for token auth = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode() headers = {"Authorization": f"Basic {auth}", "Content-Type": "application/x-www-form-urlencoded"} data = {"grant_type": "authorization_code", "code": code, "redirect_uri": REDIRECT_URI} response = requests.post(TOKEN_URL, headers=headers, data=data) token_data = response.json() session["access_token"] = token_data.get("access_token") session["refresh_token"] = token_data.get("refresh_token") return f"Access Token: {session['access_token']}
Refresh Token: {session['refresh_token']}" @app.route("/refresh") def refresh_token(): refresh_token = session.get("refresh_token") if not refresh_token: return "No refresh token available.", 400 auth = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode() headers = {"Authorization": f"Basic {auth}", "Content-Type": "application/x-www-form-urlencoded"} data = {"grant_type": "refresh_token", "refresh_token": refresh_token} response = requests.post(TOKEN_URL, headers=headers, data=data) token_data = response.json() session["access_token"] = token_data.get("access_token") session["refresh_token"] = token_data.get("refresh_token") return f"New Access Token: {session['access_token']}" if __name__ == "__main__": app.run( host="0.0.0.0", port="5000", ssl_context=( "config/cert/global-cube.com.crt", "config/cert/global-cube.com.key", # "config/cert/intermediate.crt", ), debug=True, )