如何用bash通过GitHub App的client_id和client_secret生成JWT令牌
GitHub App JWT 令牌生成指南
首先明确:GitHub App 用于自身API认证的JWT令牌不是通过client_id和client_secret生成的,而是需要使用你创建App时下载的RSA私钥文件(.pem格式)。client_id和client_secret主要用于OAuth授权流程,而非App自身的API身份验证。
一、准备必要信息
- GitHub App ID:在GitHub App设置页面(Settings > Developer settings > GitHub Apps > 你的应用)可找到,是一串数字。
- RSA私钥:创建App时下载的
.pem文件,若丢失可在App设置页面重新生成并下载。
二、JWT生成核心规则
JWT由Header、Payload、Signature三部分组成:
- Header:固定指定算法为RS256
{ "alg": "RS256", "typ": "JWT" } - Payload:必须包含三个字段
iat:当前时间戳(秒),即令牌签发时间exp:过期时间戳(秒),GitHub要求最长不能超过签发时间后10分钟(600秒)iss:你的GitHub App ID(数字)
- Signature:用RSA私钥对Header和Payload的Base64Url编码结果进行签名
三、生成方法示例
方法1:使用jwt-cli命令行工具
- 安装jwt-cli(例如通过Homebrew:
brew install jwt-cli,或对应系统的包管理器) - 执行以下命令,替换
<APP_ID>为你的App ID,<PRIVATE_KEY_PATH>为私钥文件路径:
输出的字符串就是可用于API认证的JWT令牌。jwt encode \ --alg RS256 \ --key @<PRIVATE_KEY_PATH> \ --payload '{"iat":'$(date +%s)',"exp":'$(date -v+10M +%s)',"iss":<APP_ID>}'
方法2:Python代码生成
先安装依赖库:
pip install pyjwt cryptography
运行以下代码,替换<APP_ID>和<PRIVATE_KEY_PATH>:
import jwt import time app_id = <APP_ID> # 替换为你的GitHub App ID private_key_path = "<PRIVATE_KEY_PATH>" # 替换为私钥文件路径 with open(private_key_path, "r") as f: private_key = f.read() payload = { "iat": int(time.time()), "exp": int(time.time()) + 600, # 10分钟过期,符合GitHub要求 "iss": app_id } jwt_token = jwt.encode(payload, private_key, algorithm="RS256") print(jwt_token)
方法3:在线JWT生成工具
- 打开在线JWT生成工具(如jwt.io)
- 在Header区域选择
RS256算法 - 在Payload区域填入符合规则的JSON内容,示例:
{ "iat": 1718000000, # 替换为当前时间戳(可通过在线时间戳工具获取) "exp": 1718000600, # 当前时间戳+600 "iss": 123456 # 替换为你的App ID } - 在签名验证区域粘贴你的RSA私钥内容
- 页面顶部生成的字符串即为可用的JWT令牌
四、验证令牌有效性
使用你提供的curl命令测试,替换YOUR_JWT为生成的令牌:
curl --request GET \ --url "https://api.github.com/app" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer YOUR_JWT" \ --header "X-GitHub-Api-Version: 2022-11-28"
若返回你的GitHub App信息,则说明令牌有效。
内容的提问来源于stack exchange,提问作者Vismark Juarez
相关产品推荐
相关产品推荐

