Coverage for src / main / python / services / service_token.py: 100%
16 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 22:29 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 22:29 +0000
1from datetime import UTC, datetime
2from typing import Any, cast
4import requests
7def get_service_token(
8 org_name: str, team_name: str, key_id: str, key_secret: str
9) -> dict[str, Any]:
10 """
11 Get a service token from Okta API.
13 Args:
14 org_name: The organization name
15 team_name: The team name
16 key_id: The API key ID
17 key_secret: The API key secret
19 Returns:
20 dict: The API response data
21 """
22 url = f"https://{org_name}.pam.okta.com/v1/teams/{team_name}/service_token"
24 payload = {"key_id": key_id, "key_secret": key_secret}
26 headers = {"Content-Type": "application/json"}
28 response = requests.post(url, json=payload, headers=headers)
29 response.raise_for_status() # Raise an exception for bad status codes
31 data = response.json()
33 now = datetime.now(UTC)
34 expires_at = datetime.fromisoformat(data["expires_at"].replace("Z", "+00:00"))
36 time_diff = expires_at - now
37 seconds = int(time_diff.total_seconds())
38 # print(f"Token expires in: {seconds} seconds")
39 data["expires_in"] = seconds
40 return cast(dict[str, Any], data)