Files
Brancheneinstufung2/connector-superoffice/get_refresh_token.py
Floke f1b1b70f23 feat(connector-superoffice): implement OAuth 2.0 flow and S2S architecture
Completed POC for SuperOffice integration with the following key achievements:
- Switched from RSA/SOAP to OAuth 2.0 (Refresh Token Flow) for better compatibility with SOD environment.
- Implemented robust token refreshing and caching mechanism in .
- Solved 'Wrong Subdomain' issue by enforcing  for tenant .
- Created  for REST API interaction (Search, Create, Update UDFs).
- Added helper scripts: , , .
- Documented usage and configuration in .
- Updated  configuration requirements.

[2ff88f42]
2026-02-09 16:04:16 +00:00

72 lines
2.3 KiB
Python

import os
import requests
import json
from dotenv import load_dotenv
# Load config
load_dotenv(dotenv_path="../.env")
client_id = os.getenv("SO_CLIENT_ID") or os.getenv("SO_SOD")
client_secret = os.getenv("SO_CLIENT_SECRET")
redirect_uri = "http://localhost" # Ensure this is in "Allowed Redirect URLs" in Dev Portal
if not client_id or not client_secret:
print("Error: Please set SO_CLIENT_ID (or SO_SOD) and SO_CLIENT_SECRET in .env first.")
exit(1)
# Step 1: Generate Authorization URL
auth_url = (
f"https://sod.superoffice.com/login/common/oauth/authorize"
f"?client_id={client_id}"
f"&redirect_uri={redirect_uri}"
f"&response_type=code"
f"&scope=openid" # Scope might be needed, try without first
)
print(f"\n--- STEP 1: Authorization ---")
print(f"Please open this URL in your browser:\n\n{auth_url}\n")
print("1. Log in to your test tenant (Cust55774).")
print("2. Click 'Allow' / 'Zulassen'.")
print("3. You will be redirected to a localhost URL (it might fail to load, that's fine).")
print("4. Copy the full URL from your browser's address bar and paste it here.")
redirected_url = input("\nPaste the full redirect URL here: ").strip()
# Extract code
try:
from urllib.parse import urlparse, parse_qs
parsed = urlparse(redirected_url)
code = parse_qs(parsed.query)['code'][0]
except Exception as e:
print(f"Error extracting code: {e}")
exit(1)
# Step 2: Exchange Code for Tokens
print(f"\n--- STEP 2: Token Exchange ---")
token_url = "https://sod.superoffice.com/login/common/oauth/tokens"
payload = {
"grant_type": "authorization_code",
"client_id": client_id,
"client_secret": client_secret,
"code": code,
"redirect_uri": redirect_uri
}
try:
resp = requests.post(token_url, data=payload)
resp.raise_for_status()
tokens = resp.json()
refresh_token = tokens.get("refresh_token")
access_token = tokens.get("access_token")
print("\nSUCCESS! Here are your tokens:")
print(f"\nSO_REFRESH_TOKEN=\"{refresh_token}\"\n")
print(f"\n(Access Token for testing: {access_token[:20]}...)")
print("\nAction: Please update your .env file with the SO_REFRESH_TOKEN value above!")
except Exception as e:
print(f"Error exchanging code: {e}")
if hasattr(e, 'response') and e.response:
print(f"Response: {e.response.text}")