Private/Get-PckJwtExpiry.ps1

function Get-PckJwtExpiry {
    <#
    .SYNOPSIS
    Reads the exp claim from a JWT without validating it, for cache-expiry purposes
    only. Opaque or unparseable tokens get a short assumed lifetime rather than being
    trusted forever.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string] $Token
    )

    try {
        $parts = $Token.Split('.')
        if ($parts.Count -ge 2) {
            $payload = $parts[1].Replace('-', '+').Replace('_', '/')
            switch ($payload.Length % 4) {
                2 { $payload += '==' }
                3 { $payload += '=' }
            }
            $claims = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($payload)) | ConvertFrom-Json
            if ($claims.PSObject.Properties['exp']) {
                return [DateTimeOffset]::FromUnixTimeSeconds([long]$claims.exp).LocalDateTime
            }
        }
    }
    catch {
        Write-Verbose "Token expiry could not be parsed: $($_.Exception.Message)"
    }
    return (Get-Date).AddMinutes(25)
}