我正在尝试确定如何使用 PowerShell 从我的 GitHub 应用程序检索安装令牌。
使用以下代码,基本上是从GitHub指南复制的。
function Generate-JWT-FromGithub
{
$client_id = <<APP_ID>>
$private_key_path = <<LOKAL_PATH_TO_MY_PEM_FILE>>
try {
$header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
alg = "RS256"
typ = "JWT"
}))).TrimEnd('=').Replace('+', '-').Replace('/', '_');
$payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
iat = [System.DateTimeOffset]::UtcNow.AddSeconds(-10).ToUnixTimeSeconds()
exp = [System.DateTimeOffset]::UtcNow.AddMinutes(10).ToUnixTimeSeconds()
iss = $client_id
}))).TrimEnd('=').Replace('+', '-').Replace('/', '_');
$rsa = [System.Security.Cryptography.RSA]::Create()
$rsa.ImportFromPem((Get-Content $private_key_path -Raw))
$signature = [Convert]::ToBase64String($rsa.SignData([System.Text.Encoding]::UTF8.GetBytes("$header.$payload"), [System.Security.Cryptography.HashAlgorithmName]::SHA256, [System.Security.Cryptography.RSASignaturePadding]::Pkcs1)).TrimEnd('=').Replace('+', '-').Replace('/', '_')
$jwt = "$header.$payload.$signature"
return $jwt
}
catch {
Handle-Error $_.Exception.Message
}
}
function Get-InstallationToken {
param(
$JwtToken,
$InstallationId
)
$Headers = @{
Authorization = "Bearer $JwtToken"
Accept = "application/vnd.github.v3+json"
"X-GitHub-Api-Version" = "2022-11-28"
}
$Url = "https://api.github.com/app/installations/$InstallationId/access_tokens"
$Response = Invoke-RestMethod -Method Post -Uri $Url -Headers $Headers
return $Response.token
}
$InstallationId = <<ID_FROM_MY_GITHUB_APP>>
$JwtToken = Generate-JWT-FromGithub
$InstallationToken = Get-InstallationToken -JwtToken $JwtToken -InstallationId $InstallationId
响应状态码不表示成功:401(未经授权)。
我确保 PEM 文件有效。我还检查了两次 APP_ID 和安装 ID。 结果始终是“响应状态代码不表示成功:401(未经授权)。”
代码中肯定有一个小错别字。
要找到答案,请在工作流程中对 JwtToken 进行 Base64 编码,然后将其输出到 stdout。
运行工作流程,找到输出,对其进行解码并检索 JWT 令牌。然后使用
https://jwt.io/
读取令牌内容。
确保令牌有效。