private/get-Assertion.ps1
function Get-Assertion{ <# Author = "Jos Lieben (jos@lieben.nu)" CompanyName = "Lieben Consultancy" Copyright = "https://www.lieben.nu/liebensraum/commercial-use/" #> Param() $cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object {$_.Subject -eq "CN=$($global:octo.LCTenantId)"} $clientAssertion = @{ Header = @{ alg = "RS256" typ = "JWT" x5t = [System.Convert]::ToBase64String(($cert.GetCertHash())) } ClaimsPayload = @{ aud = "https://login.microsoftonline.com/$($global:octo.LCTenantId)/oauth2/token" exp = [math]::Round(((New-TimeSpan -Start ((Get-Date "1970-01-01T00:00:00Z" ).ToUniversalTime()) -End (Get-Date).ToUniversalTime().AddMinutes(2)).TotalSeconds), 0) iss = $($global:octo.LCClientId) jti = (New-Guid).Guid nbf = [math]::Round(((New-TimeSpan -Start ((Get-Date "1970-01-01T00:00:00Z" ).ToUniversalTime()) -End ((Get-Date).ToUniversalTime())).TotalSeconds), 0) sub = $($global:octo.LCClientId) } } $clientAssertion['Base64Header'] = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(($clientAssertion.Header | ConvertTo-Json -Compress))).Split('=')[0].Replace('+', '-').Replace('/', '_') $clientAssertion['Base64ClaimsPayload'] = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(($clientAssertion.ClaimsPayload | ConvertTo-Json -Compress))).Split('=')[0].Replace('+', '-').Replace('/', '_') $clientAssertion['Signature'] = [Convert]::ToBase64String( $cert.PrivateKey.SignData( [System.Text.Encoding]::UTF8.GetBytes("$($clientAssertion.Base64Header).$($clientAssertion.Base64ClaimsPayload)"), [Security.Cryptography.HashAlgorithmName]::SHA256, [Security.Cryptography.RSASignaturePadding]::Pkcs1 ) ).Replace('+', '-').Replace('/', '_').Replace('=', '') return "$($clientAssertion.Base64Header).$($clientAssertion.Base64ClaimsPayload).$($clientAssertion.Signature)" } |