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 } |