如何使用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
相关产品推荐
相关产品推荐

