import requests
import time
from datetime import datetime, timedelta
class APIAuthenticator:
def __init__(self, base_url, username, password):
self.base_url = base_url
self.username = username
self.password = password
self.token_data = None
self.token_expiry = None
def get_valid_token(self):
if not self.token_data or datetime.now() >= self.token_expiry:
self.authenticate()
return self.token_data['access_token']
def authenticate(self):
response = requests.post(
f"{self.base_url}/auth/token",
json={
"username": self.username,
"password": self.password,
"grant_type": "password"
},
headers={"Content-Type": "application/json"}
)
if response.status_code == 200:
self.token_data = response.json()
self.token_expiry = datetime.now() + timedelta(
seconds=self.token_data['expires_in'] - 60 # 1 minute buffer
)
else:
raise Exception(f"Authentication failed: {response.text}")
def make_authenticated_request(self, method, endpoint, **kwargs):
token = self.get_valid_token()
headers = kwargs.get('headers', {})
headers['Authorization'] = f"Bearer {token}"
kwargs['headers'] = headers
return requests.request(method, f"{self.base_url}{endpoint}", **kwargs)
# Usage example
auth = APIAuthenticator("https://api.yourdomain.com", "username", "password")
response = auth.make_authenticated_request("GET", "/documents")