Private/Authentication/CloudFactory/Get-CFAccessToken.ps1

function Get-CFAccessToken {
    $baseUri = "https://portal.api.cloudfactory.dk"
    $refreshToken = Get-CFRefreshToken
    $accessTokenEndpoint = "$baseUri/Authenticate/ExchangeRefreshToken/$refreshToken"


    $cacheKey = "CFRefresh"
    $now = Get-Date

    # Check cache for valid token
    if ($script:TokenCache.ContainsKey($cacheKey)) {
        $cachedToken = $script:TokenCache[$cacheKey]
        
        # Token is still valid
        if ($cachedToken.ExpirationDateTime -gt $now) {
            Write-ModuleLog -Message "Using cached token for $cacheKey" -Level Verbose -Component 'CloudFactoryAccessToken'
            return $cachedToken
        }
    }

    Write-ModuleLog -Message "Getting new token for $cacheKey" -Level Verbose -Component 'CloudFactory'
    try {
        $accessTokenResponse = Invoke-RestMethod -Uri $accessTokenEndpoint -Method Get
        $accessToken = $accessTokenResponse.access_token
        $token = [PSCustomObject]@{
            AccessToken         = $accessToken
            AuthorizationHeader = "bearer $($accessToken)"
            ExpirationDateTime = (Get-Date).AddHours(24)
        }
        
    }
    catch {
        Write-ModuleLog -Message "Failed to get CloudFactory access token" -Level Error -Component 'CloudFactoryAccessToken' -ErrorRecord $_
        throw [CloudFactoryTokenOperationException]::new(
            'Initialization',
            'Failed to get CloudFactory access token',
            $_
        )
    }

    # Manage cache
    try {
        if ($script:TokenCache.Count -ge $script:TokenCacheConfig.MaxSize) {
            $oldestTokens = $script:TokenCache.GetEnumerator() | 
            Sort-Object { $_.Value.ExpirationDateTime } |
            Select-Object -First ($script:TokenCache.Count - $script:TokenCacheConfig.MaxSize + 1)
            
            foreach ($oldToken in $oldestTokens) {
                $script:TokenCache.Remove($oldToken.Key)
            }
        }

        $script:TokenCache[$cacheKey] = $token

        Write-ModuleLog -Message "Token cached successfully for $cacheKey" -Level Verbose -Component 'CloudFactoryAccessToken'
        Save-TokenCache
    }
    catch {
        Write-ModuleLog -Message "Failed to manage token cache" -Level Error -Component 'CuranetAccessToken' -ErrorRecord $_
    }

    return $token
}