You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Go从GitHub App的PEM私钥生成JWT?

使用Go为GitHub App生成JWT身份验证令牌

要为GitHub App生成用于身份验证的JWT,你可以借助Go标准库和jwt/v5包实现,以下是完整步骤和代码示例:

1. 准备依赖

首先安装官方推荐的JWT处理库:

go get github.com/golang-jwt/jwt/v5

2. 核心实现步骤

加载PEM格式私钥

先读取从GitHub App后台下载的PEM私钥文件,解析出可用的RSA私钥:

import (
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "os"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

func loadPrivateKey(path string) (*rsa.PrivateKey, error) {
    keyBytes, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("读取私钥文件失败: %w", err)
    }

    // 解析PEM块
    block, _ := pem.Decode(keyBytes)
    if block == nil || block.Type != "RSA PRIVATE KEY" {
        return nil, fmt.Errorf("无效的PEM块: 预期类型为RSA PRIVATE KEY")
    }

    // 解析RSA私钥
    privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return nil, fmt.Errorf("解析RSA私钥失败: %w", err)
    }

    return privateKey, nil
}

生成符合GitHub要求的JWT

构建GitHub规定的JWT声明字段,并用私钥签名生成令牌:

func generateGitHubJWT(appID int64, privateKey *rsa.PrivateKey) (string, error) {
    now := time.Now()

    // GitHub要求的JWT声明字段
    claims := jwt.MapClaims{
        "iss": appID,          // 你的GitHub App ID,在App后台"About"区域可查
        "iat": now.Unix(),     // 令牌签发时间戳
        "exp": now.Add(10 * time.Minute).Unix(), // 过期时间,最长不能超过60分钟
    }

    // 使用RS256算法创建令牌实例
    token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)

    // 用私钥签名生成最终令牌字符串
    tokenString, err := token.SignedString(privateKey)
    if err != nil {
        return "", fmt.Errorf("签名JWT失败: %w", err)
    }

    return tokenString, nil
}

调用示例

在主逻辑中整合上述函数:

func main() {
    const appID = 123456 // 替换为你的GitHub App ID
    privateKeyPath := "./github-app-private-key.pem" // 替换为你的私钥文件路径

    privateKey, err := loadPrivateKey(privateKeyPath)
    if err != nil {
        panic(err)
    }

    jwtToken, err := generateGitHubJWT(appID, privateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println("生成的JWT令牌:", jwtToken)
}

注意事项

  • 私钥文件权限建议设置为600,避免被其他用户读取
  • JWT过期时间exp必须控制在签发后的10-60分钟之间,GitHub会拒绝超出该范围的令牌
  • App ID可在GitHub App设置页面的"About"板块找到

内容的提问来源于stack exchange,提问作者Gal Yakir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:03:20