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]
This commit is contained in:
71
connector-superoffice/get_refresh_token.py
Normal file
71
connector-superoffice/get_refresh_token.py
Normal file
@@ -0,0 +1,71 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user