115 lines
4.0 KiB
Python
115 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
This script helps debug OAuth URL generation when behind a reverse proxy.
|
|
It's especially useful for debugging HTTPS redirection issues.
|
|
|
|
Usage:
|
|
python debug_oauth_urls.py [--https] [--host hostname] [--port portnumber]
|
|
|
|
Options:
|
|
--https Force HTTPS URL generation regardless of request headers
|
|
--host Set the hostname (default: localhost)
|
|
--port Set the port number (default: 5000)
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import argparse
|
|
from flask import Flask, request, jsonify
|
|
from dotenv import load_dotenv
|
|
|
|
# Make sure we can import from the musicround package
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
# Parse command line arguments
|
|
parser = argparse.ArgumentParser(description="Debug OAuth URL generation")
|
|
parser.add_argument("--https", action="store_true",
|
|
help="Force HTTPS URL generation")
|
|
parser.add_argument("--host", default="localhost",
|
|
help="Set the hostname (default: localhost)")
|
|
parser.add_argument("--port", type=int, default=5000,
|
|
help="Set the port number (default: 5000)")
|
|
args = parser.parse_args()
|
|
|
|
# Load environment variables
|
|
load_dotenv()
|
|
|
|
# If .env.oauth exists, load it too (it has OAuth specific settings)
|
|
if os.path.exists(".env.oauth"):
|
|
load_dotenv(".env.oauth")
|
|
|
|
# If .env.oauth.production exists and --https is specified, load that instead
|
|
if args.https and os.path.exists(".env.oauth.production"):
|
|
load_dotenv(".env.oauth.production", override=True)
|
|
print("Loading production OAuth settings from .env.oauth.production")
|
|
|
|
# Create a small Flask app just for debugging
|
|
app = Flask(__name__)
|
|
|
|
# Override config with command line args
|
|
app.config["USE_HTTPS"] = args.https
|
|
app.config["PREFERRED_URL_SCHEME"] = "https" if args.https else "http"
|
|
|
|
@app.route("/")
|
|
def debug_oauth():
|
|
"""Generate debug information for OAuth URLs"""
|
|
from musicround.helpers.auth_helpers import get_oauth_redirect_uri
|
|
|
|
# Generate endpoints to test
|
|
endpoints = [
|
|
("auth.callback", None),
|
|
("users.spotify_link_callback", None),
|
|
("users.google_callback", None),
|
|
("users.authentik_callback", None),
|
|
("users.dropbox_callback", None)
|
|
]
|
|
|
|
# Generate test URLs
|
|
test_urls = {}
|
|
for endpoint, provider in endpoints:
|
|
try:
|
|
# We need to be in an app context to use url_for
|
|
with app.app_context():
|
|
# Allow KeyErrors to propagate so we know which endpoints don't exist
|
|
url = get_oauth_redirect_uri(endpoint, provider)
|
|
test_urls[endpoint] = url
|
|
except Exception as e:
|
|
test_urls[endpoint] = f"ERROR: {str(e)}"
|
|
|
|
# Get request info
|
|
headers = {
|
|
key: value for key, value in request.headers.items()
|
|
if key.lower() in ('x-forwarded-for', 'x-forwarded-proto',
|
|
'x-forwarded-host', 'host', 'origin', 'referer')
|
|
}
|
|
|
|
# Return detailed info
|
|
return jsonify({
|
|
"test_urls": test_urls,
|
|
"config": {
|
|
"USE_HTTPS": app.config.get("USE_HTTPS", False),
|
|
"PREFERRED_URL_SCHEME": app.config.get("PREFERRED_URL_SCHEME", "http"),
|
|
"STATIC_OAUTH_URLS": app.config.get("STATIC_OAUTH_URLS", False),
|
|
"args": {
|
|
"https": args.https,
|
|
"host": args.host,
|
|
"port": args.port
|
|
},
|
|
},
|
|
"headers": headers,
|
|
"request_info": {
|
|
"url": request.url,
|
|
"base_url": request.base_url,
|
|
"host": request.host,
|
|
"scheme": request.scheme,
|
|
}
|
|
})
|
|
|
|
if __name__ == "__main__":
|
|
print(f"Starting OAuth URL Debug server on http://{args.host}:{args.port}")
|
|
print(f"USE_HTTPS is set to: {app.config['USE_HTTPS']}")
|
|
print(f"PREFERRED_URL_SCHEME is set to: {app.config['PREFERRED_URL_SCHEME']}")
|
|
print(f"Visit http://{args.host}:{args.port}/ to see debug information")
|
|
|
|
app.run(host=args.host, port=args.port, debug=True)
|