functions/other/New-JWTToken.ps1
function New-JWTToken { param ( [Parameter(Position = 1, Mandatory = $true)] [string] $CertFileName, [Parameter(Position = 2, Mandatory = $true)] [string] $TenantId, [Parameter(Position = 3, Mandatory = $true)] [string] $ClientId, [Parameter(Position = 4, Mandatory = $true)] [Int32] $ValidateForMinutes, [Parameter(Mandatory = $True)] [Security.SecureString] $password ) Begin { $date1 = Get-Date -Date "01/01/1970" $date2 = (Get-Date).ToUniversalTime().AddMinutes($ValidateForMinutes) $date3 = (Get-Date).ToUniversalTime().AddMinutes(-5) $exp = [Math]::Round((New-TimeSpan -Start $date1 -End $date2).TotalSeconds, 0) $nbf = [Math]::Round((New-TimeSpan -Start $date1 -End $date3).TotalSeconds, 0) $exVal = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $CertFileName, $password, $exVal $x5t = [System.Convert]::ToBase64String($cert.GetCertHash()) $jti = [System.Guid]::NewGuid().ToString() $Headerassertaion = "{" $Headerassertaion += " `"alg`": `"RS256`"," $Headerassertaion += " `"x5t`": `"" + $x5t + "`"" $Headerassertaion += "}" $PayLoadassertaion += "{" $PayLoadassertaion += " `"aud`": `"https://login.windows.net/" + $TenantId + "/oauth2/token`"," $PayLoadassertaion += " `"exp`": $exp," $PayLoadassertaion += " `"iss`": `"" + $ClientId + "`"," $PayLoadassertaion += " `"jti`": `"" + $jti + "`"," $PayLoadassertaion += " `"nbf`": $nbf," $PayLoadassertaion += " `"sub`": `"" + $ClientId + "`"" $PayLoadassertaion += "} " $encodedHeader = [System.Convert]::ToBase64String([System.Text.UTF8Encoding]::UTF8.GetBytes($Headerassertaion)).Replace('=', '').Replace('+', '-').Replace('/', '_') $encodedPayLoadassertaion = [System.Convert]::ToBase64String([System.Text.UTF8Encoding]::UTF8.GetBytes($PayLoadassertaion)).Replace('=', '').Replace('+', '-').Replace('/', '_') $JWTOutput = $encodedHeader + "." + $encodedPayLoadassertaion $SigBytes = [System.Text.UTF8Encoding]::UTF8.GetBytes($JWTOutput) $rsa = $cert.PrivateKey; $sha256 = [System.Security.Cryptography.SHA256]::Create() $hash = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($encodedHeader + '.' + $encodedPayLoadassertaion)); $sigform = New-Object System.Security.Cryptography.RSAPKCS1SignatureFormatter($rsa); $sigform.SetHashAlgorithm("SHA256"); $sig = [System.Convert]::ToBase64String($sigform.CreateSignature($hash)).Replace('=', '').Replace('+', '-').Replace('/', '_') $JWTOutput = $encodedHeader + '.' + $encodedPayLoadassertaion + '.' + $sig Write-Output ($JWTOutput) } } |