#!/usr/bin/env python3 """ Simple script to test Adobe API authentication with additional debugging """ import requests import time import json # The token from your update API_KEY = "f34becb759244899bd73b86220f6fb92" ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsIng1dSI6Imltc19uYTEta2V5LWF0LTEuY2VyIiwia2lkIjoiaW1zX25hMS1rZXktYXQtMSIsIml0dCI6ImF0In0.eyJpZCI6IjE3NDQ4NzYzNDM5MzdfNTE1YjU0NTgtZDU3NC00N2RlLThmNzgtYjQ5MGMwYjZiOWYyX3VlMSIsIm9yZyI6IkZBRDYxRTI3NjY4NkRCM0QwQTQ5NUVDNEBBZG9iZU9yZyIsInR5cGUiOiJhY2Nlc3NfdG9rZW4iLCJjbGllbnRfaWQiOiJmMzRiZWNiNzU5MjQ0ODk5YmQ3M2I4NjIyMGY2ZmI5MiIsInVzZXJfaWQiOiJEQTM3MUY1NzY3RUJEMDdEMEE0OTVGOTRAdGVjaGFjY3QuYWRvYmUuY29tIiwiYXMiOiJpbXMtbmExIiwiYWFfaWQiOiJEQTM3MUY1NzY3RUJEMDdEMEE0OTVGOTRAdGVjaGFjY3QuYWRvYmUuY29tIiwiY3RwIjozLCJtb2kiOiIzMDA1NWZlNyIsImV4cGlyZXNfaW4iOiI4NjQwMDAwMCIsImNyZWF0ZWRfYXQiOiIxNzQ0ODc2MzQzOTM3Iiwic2NvcGUiOiJvcGVuaWQsQWRvYmVJRCxyZWFkX29yZ2FuaXphdGlvbnMifQ.P0J4J7Qy-zflhrq6u2JX1rXucimiwuR__bkXJnZ4ZSiNY9G6fMPL1ym0isrFTAadVisgJLlHsh0QQZpLY5l-Uv3XZZRWnbK7fo2uDy4j-o7Y4aO7vBQ-VyCS8C7D_msgnHHnFcxwYXGAmv10-AFUfBsw3Y1xRVjDMIJH1Ux8NdbZ8j1zJXN1FPuuBi8fH1hmKda85nuXJsKc7TqaYBzX4AGzWBPV6hyoKedzrNtPCNRx3muhHnCS_q6wmk6Jx6kVAxrYPeeoA-W-ZKJrP-5BhQf0KUVOBtaCBKlrDL-ftML0LZlWswB14kKTMkt9R7z6xwLyPWfD1ldFh3bEMaa0YA" def test_auth(access_token, api_key=None): """Test authentication with Adobe API""" print(f"Testing authentication with token: {access_token[:20]}...{access_token[-20:]}") try: # Test with userinfo endpoint (requires auth token only) headers = {"Authorization": f"Bearer {access_token}"} response = requests.get( "https://ims-na1.adobelogin.com/ims/userinfo", headers=headers, timeout=20 ) print(f"IMS User Info response status: {response.status_code}") try: headers_dict = dict(response.headers) print(f"Response headers: {json.dumps(headers_dict, indent=2)}") except: print("Could not display response headers") if response.text: print(f"Response body: {response.text}") # If API key is provided, also test an API that requires both if api_key: api_headers = { "Authorization": f"Bearer {access_token}", "x-api-key": api_key, "Content-Type": "application/json" } print("\nTesting with API key and token together...") # Try Adobe Developer API dev_response = requests.get( "https://developer.adobe.com/apis", headers=api_headers, timeout=20 ) print(f"Developer API response status: {dev_response.status_code}") # Try Stock API stock_params = {"search_parameters[limit]": 1} stock_response = requests.get( "https://stock.adobe.io/Rest/Media/1/Search/Files", headers=api_headers, params=stock_params, timeout=20 ) print(f"Stock API response status: {stock_response.status_code}") if stock_response.text and len(stock_response.text) < 500: print(f"Stock API response: {stock_response.text}") # Test Photoshop API endpoints that we need ps_endpoints = [ "https://image.adobe.io/pie/psdService/text", "https://image.adobe.io/pie/psdService/presignedUrl", "https://firefly-api.adobe.io/v2/photoshop/editText", "https://firefly-api.adobe.io/v2/storage/presignedUrl" ] print("\nTesting Photoshop API endpoints:") for endpoint in ps_endpoints: try: ps_response = requests.get( endpoint, headers=api_headers, timeout=15 ) print(f" {endpoint}: Status {ps_response.status_code}") # If we get a response that's not too long, show it if ps_response.text and len(ps_response.text) < 300: print(f" Response: {ps_response.text}") except Exception as e: print(f" {endpoint}: Error - {str(e)}") # Analyze token regardless of auth success try: import base64 # Get payload part (second part of the JWT token) payload = access_token.split('.')[1] # Add padding if needed padding = len(payload) % 4 if padding: payload += '=' * (4 - padding) # Decode the payload decoded = base64.b64decode(payload) token_data = json.loads(decoded) # Extract token data print("\nToken data (full JWT payload):") print(json.dumps(token_data, indent=2)) # Check created_at and expires_in # Note: Adobe timestamps are in milliseconds since epoch created_at_ms = int(token_data.get('created_at', 0)) created_at = created_at_ms / 1000 # Convert to seconds expires_in_sec = int(token_data.get('expires_in', 0)) current_time = time.time() print("\nToken details (corrected timestamps):") print(f" Created at: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(created_at))}") print(f" Expires in: {expires_in_sec} seconds ({expires_in_sec/86400:.1f} days)") print(f" Current time: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(current_time))}") # Check if token is expired expiration_time = created_at + expires_in_sec if current_time > expiration_time: print(f" ✗ Token EXPIRED on {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(expiration_time))}") else: print(f" ✓ Token valid until {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(expiration_time))}") print(f" ({(expiration_time - current_time)/86400:.1f} days remaining)") # Calculate actual age of token token_age_days = (current_time - created_at) / 86400 print(f" Token age: {token_age_days:.1f} days") # Print scopes scopes = token_data.get('scope', '').split(',') print("\nToken scopes:") for scope in scopes: print(f" - {scope}") except Exception as e: print(f"Error analyzing token: {str(e)}") if response.status_code == 200: print("\n✓ Authentication successful!") return True else: print(f"\n✗ Authentication failed: {response.status_code}") return False except Exception as e: print(f"✗ Error testing authentication: {str(e)}") return False if __name__ == "__main__": print("Enhanced Adobe API Authentication Test") print("-" * 40) print("Testing token and API key...") # Try a few times in case of network issues max_attempts = 2 for attempt in range(1, max_attempts + 1): print(f"\nAttempt {attempt} of {max_attempts}") result = test_auth(ACCESS_TOKEN, API_KEY) if result: break elif attempt < max_attempts: print(f"Retrying in 5 seconds...") time.sleep(5) print("\nTest complete.")