Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@darrenjrobinson
Created July 18, 2019 04:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darrenjrobinson/49006fb7670af2e6983da34c9134177d to your computer and use it in GitHub Desktop.
Save darrenjrobinson/49006fb7670af2e6983da34c9134177d to your computer and use it in GitHub Desktop.
Decode an Azure JWT Token and find expiry time in local timezone
function Parse-JWTtoken {
[cmdletbinding()]
param([Parameter(Mandatory = $true)][string]$token)
#Validate as per https://tools.ietf.org/html/rfc7519
#Access and ID tokens are fine, Refresh tokens will not work
if (!$token.Contains(".") -or !$token.StartsWith("eyJ")) { Write-Error "Invalid token" -ErrorAction Stop }
#Header
$tokenheader = $token.Split(".")[0].Replace('-', '+').Replace('_', '/')
#Fix padding as needed, keep adding "=" until string length modulus 4 reaches 0
while ($tokenheader.Length % 4) { Write-Verbose "Invalid length for a Base-64 char array or string, adding ="; $tokenheader += "=" }
Write-Verbose "Base64 encoded (padded) header:"
Write-Verbose $tokenheader
#Convert from Base64 encoded string to PSObject all at once
Write-Verbose "Decoded header:"
[System.Text.Encoding]::ASCII.GetString([system.convert]::FromBase64String($tokenheader)) | ConvertFrom-Json | fl | Out-Default
#Payload
$tokenPayload = $token.Split(".")[1].Replace('-', '+').Replace('_', '/')
#Fix padding as needed, keep adding "=" until string length modulus 4 reaches 0
while ($tokenPayload.Length % 4) { Write-Verbose "Invalid length for a Base-64 char array or string, adding ="; $tokenPayload += "=" }
Write-Verbose "Base64 encoded (padded) payoad:"
Write-Verbose $tokenPayload
#Convert to Byte array
$tokenByteArray = [System.Convert]::FromBase64String($tokenPayload)
#Convert to string array
$tokenArray = [System.Text.Encoding]::ASCII.GetString($tokenByteArray)
Write-Verbose "Decoded array in JSON format:"
Write-Verbose $tokenArray
#Convert from JSON to PSObject
$tokobj = $tokenArray | ConvertFrom-Json
Write-Verbose "Decoded Payload:"
return $tokobj
}
function Convert-UnixTime {
Param([Parameter(Mandatory = $true)][int32]$unixDate)
$orig = (Get-Date -Year 1970 -Month 1 -Day 1 -hour 0 -Minute 0 -Second 0 -Millisecond 0)
$timeZone = Get-TimeZone
$utcTime = $orig.AddSeconds($unixDate)
$localTime = $utcTime.AddHours($timeZone.BaseUtcOffset.Hours) # Return local time
return $localTime
}
$azureToken = Parse-JWTtoken($Global:accesstoken)
$tokenExpires = Convert-UnixTime($azureToken.exp)
$tokenExpires
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment