Private/EAI/Get-EAIBearerToken.ps1

function Get-EAIBearerToken {
    <#
    .SYNOPSIS
    Returns a valid Bearer token, refreshing when needed.

    .DESCRIPTION
    Returns the cached access token when it expires more than 60 seconds from now.
    Otherwise requests a new token and updates auth state.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [PSCustomObject]$Auth,

        [Switch]$ForceRefresh,

        [System.Management.Automation.PSCmdlet]$CallerPSCmdlet
    )

    $refreshBufferSeconds = 60
    $now = (Get-Date).ToUniversalTime()

    if (-not $ForceRefresh -and $Auth.AccessToken -and $Auth.TokenExpiresAt) {
        if ($now.AddSeconds($refreshBufferSeconds) -lt $Auth.TokenExpiresAt) {
            return [System.Net.NetworkCredential]::new('', $Auth.AccessToken).Password
        }
    }

    $tokenResult = Request-EAIAccessToken -EdwinOrg $Auth.EdwinOrg -ClientId $Auth.ClientId -ClientSecret $Auth.ClientSecret -CallerPSCmdlet $CallerPSCmdlet

    $Auth.AccessToken = $tokenResult.AccessToken
    $Auth.TokenExpiresAt = $tokenResult.ExpiresAt

    if ($Script:EAIAuth -and $Script:EAIAuth -eq $Auth) {
        $Script:EAIAuth.AccessToken = $tokenResult.AccessToken
        $Script:EAIAuth.TokenExpiresAt = $tokenResult.ExpiresAt
    }

    return [System.Net.NetworkCredential]::new('', $tokenResult.AccessToken).Password
}