GitHub 通过 PowerShell 将 JWT 应用到安装令牌

问题描述 投票:0回答:1

我正在尝试确定如何使用 PowerShell 从我的 GitHub 应用程序检索安装令牌。

基于私有PEM生成JWT

使用以下代码,基本上是从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
    }
}

从 GitHub API 获取安装令牌

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
}

调用PowerShell 7

$InstallationId = <<ID_FROM_MY_GITHUB_APP>>
$JwtToken = Generate-JWT-FromGithub 
$InstallationToken = Get-InstallationToken -JwtToken $JwtToken -InstallationId $InstallationId

我面临以下问题

响应状态码不表示成功:401(未经授权)。

我确保 PEM 文件有效。我还检查了两次 APP_ID 和安装 ID。 结果始终是“响应状态代码不表示成功:401(未经授权)。”

powershell jwt github-api github-app
1个回答
0
投票

代码中肯定有一个小错别字。

要找到答案,请在工作流程中对 JwtToken 进行 Base64 编码,然后将其输出到 stdout。

运行工作流程,找到输出,对其进行解码并检索 JWT 令牌。然后使用

https://jwt.io/

读取令牌内容。

确保令牌有效。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.