Private/Get-Header.ps1

<#
.Synopsis
   Gets the header for a rest calls
.DESCRIPTION
   The Get-Header cmdlet gets the script level variables and handles refresh tokens if nessesary
.PARAMETER Token
    This is the auth token object
#>

function Get-Header {

    [CmdletBinding()]
    [OutputType([psobject])]
    param()

    begin {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Function started"
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    }

    process {
        Write-Debug "[$($MyInvocation.MyCommand.Name)] PSBoundParameters: $($PSBoundParameters | Out-String)"

        $header = Get-Variable -Scope Script -Name headers -ValueOnly
        if ($null -eq $header) {
            $message = "header is not set in script variable. Call Get-Credentials first"
            Write-Error -Message $message
            throw $message
        }

        $token = Get-Variable -Scope Script -Name token -ValueOnly
        if ($null -eq $token) {
            $message = "token is not set in script variable. Call Get-Credentials first"
            Write-Error -Message $message
            throw $message
        }
        $tokenExpiresAt = Get-Variable -Scope Script -Name tokenExpiresAt -ValueOnly

        $now = Get-Date
        Write-Debug "$($now) $($tokenExpiresAt)"
        if ($now -gt $tokenExpiresAt) {
            Write-Debug "*************** Refresh Token *************** "
            $url = Get-Variable -Scope Script -Name oAuthTokenEndpoint -ValueOnly
            $body = "grant_type=refresh_token&refresh_token=$($token.refresh_token)"
            $refreshHeader = @{
                "Authorization"="Basic Y2Y6"
                "Accept"="application/json"
                "Content-Type"="application/x-www-form-urlencoded; charset=UTF-8"
            }
            $response = Invoke-Retry -ScriptBlock {
                Write-Output (Invoke-WebRequest -uri $url -Method Post -Header $refreshHeader -Body $body )
            }
            Write-Debug $response
            if ($response.StatusCode -ne 200) {
                $message = "$($url) $($response.StatusCode)"
                Write-Error -Message $message
                throw $message
            }
            $token = ($response | ConvertFrom-Json)
            $header = Set-Headers $token
        }
        return $header
    }

    end {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Complete"
    }
}