Private/ConvertFrom-JWT.ps1

<#
.SYNOPSIS
Decode JWT access_token or id_Token.
@Source: https://www.michev.info/Blog/Post/2140/decode-jwt-access-and-id-Tokens-via-powershell ©Vasil_Michev
 
.PARAMETER Token
Mandatory: WS1 Access Token.
 
.PARAMETER IncludeHeader
Optional: Return header.
 
.EXAMPLE
ConvertFrom-JWT -Token $Token.access_Token
#>

Function ConvertFrom-JWT {
    [cmdletbinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Token,[Alias('ih')][switch]$IncludeHeader
    )
    # Access and ID Tokens are fine, Refresh Tokens will not work
    If (!$Token.Contains(".") -or !$Token.StartsWith("eyJ")) { 
        Write-Error "Invalid Token"
        Return $false
    }
    # Extract header and payload
    $TokenHeader, $TokenPayload = $Token.Split(".").Replace('-', '+').Replace('_', '/')[0..1]
    # Fix padding as needed, keep adding "=" until string length modulus 4 reaches 0
    While ($TokenHeader.Length % 4) { Write-Debug "Invalid length For a Base-64 char array or string, adding ="; $TokenHeader += "=" }
    While ($TokenPayload.Length % 4) { Write-Debug "Invalid length For a Base-64 char array or string, adding ="; $TokenPayload += "=" }
    Write-Debug "Base64 encoded (padded) Header:`n$TokenHeader"
    Write-Debug "Base64 encoded (padded) payoad:`n$TokenPayload"
    # Convert Header from Base64 encoded string to PSObject all at once
    $Header = [System.Text.Encoding]::ASCII.GetString([system.convert]::FromBase64String($TokenHeader)) | ConvertFrom-Json
    Write-Debug "Decoded Header:`n$Header"
    # Convert payload to string array
    $TokenArray = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($TokenPayload))
    Write-Debug "Decoded array in JSON format:`n$TokenArray"  
    # Convert from JSON to PSObject
    $TokOBJ = $TokenArray | ConvertFrom-Json
    Write-Debug "Decoded Payload:"
    
    If($IncludeHeader){ Return $Header }
    Return $TokOBJ
}