|
声明
|
含义
|
详细信息
|
iat
|
颁发时间
|
JWT 创建时间。 为了防止时钟偏移,建议你将此时间设置在 60 秒之前,并确保服务器的日期和时间已正确设置(例如,通过使用网络时间协议)。
|
exp
|
到期时间
|
JWT 的过期时间,在此时间之后不能用于请求安装令牌。 时间不能超过未来 10 分钟。
|
iss
|
颁发者
|
GitHub App 的 ID。 此值用于查找正确的公钥来验证 JWT 的签名。 可以使用
GET /app
REST API 终结点查找应用的 ID。 有关详细信息,请参阅 REST API 文档中的“
应用
”。
|
alg
|
消息身份验证代码算法
|
这应该是
RS256
,因为必须使用
RS256
算法对 JWT 进行签名。
|
若要使用 JWT,请在 API 请求的
Authorization
标头中传递它。 例如:
curl --request GET \
--url "http(s)://HOSTNAME/api/v3/app" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR_JWT" \
--header "X-GitHub-Api-Version: 2022-11-28"
在大多数情况下,可以使用
Authorization: Bearer
或
Authorization: token
传递令牌。 但是,如果要传递 JSON Web 令牌 (JWT),则必须使用
Authorization: Bearer
。
大多数编程语言都有一个可以生成 JWT 的包。 在所有情况下,你必须具有私钥和 GitHub App 的 ID。 有关生成私钥的详细信息,请参阅“
管理 GitHub 应用的私钥
”。 可以使用
GET /app
REST API 终结点查找应用的 ID。 有关详细信息,请参阅 REST API 文档中的“
应用
”。
注意:可以使用 GitHub 的 Octokit SDK 作为应用进行身份验证,而不是创建 JWT。 SDK 将负责为你生成 JWT,并在令牌过期后重新生成 JWT。 有关详细信息,请参阅“
使用 REST API 和 JavaScript 编写脚本
”。
注意:必须运行
gem install jwt
才能安装
jwt
包,以便使用此脚本。
在以下示例中,将
YOUR_PATH_TO_PEM
替换为存储私钥的文件路径。 将
YOUR_APP_ID
替换为你的应用的 ID。 请确保以双引号括住
YOUR_PATH_TO_PEM
和
YOUR_APP_ID
的值。
require 'openssl'
require 'jwt'
private_pem = File.read("YOUR_PATH_TO_PEM")
private_key = OpenSSL::PKey::RSA.new(private_pem)
payload = {
iat: Time.now.to_i - 60,
exp: Time.now.to_i + (10 * 60),
iss: "YOUR_APP_ID"
jwt = JWT.encode(payload, private_key, "RS256")
puts jwt
注意:必须运行 pip install jwt 才能安装 jwt 包,以便使用此脚本。
Python#!/usr/bin/env python3
import jwt
import time
import sys
# Get PEM file path
if len(sys.argv) > 1:
pem = sys.argv[1]
else:
pem = input("Enter path of private PEM file: ")
# Get the App ID
if len(sys.argv) > 2:
app_id = sys.argv[2]
else:
app_id = input("Enter your APP ID: ")
# Open PEM
with open(pem, 'rb') as pem_file:
signing_key = jwt.jwk_from_pem(pem_file.read())
payload = {
# Issued at time
'iat': int(time.time()),
# JWT expiration time (10 minutes maximum)
'exp': int(time.time()) + 600,
# GitHub App's identifier
'iss': app_id
# Create JWT
jwt_instance = jwt.JWT()
encoded_jwt = jwt_instance.encode(payload, signing_key, alg='RS256')
print(f"JWT: {encoded_jwt}")
import jwt
import time
import sys
if len(sys.argv) > 1:
pem = sys.argv[1]
else:
pem = input("Enter path of private PEM file: ")
if len(sys.argv) > 2:
app_id = sys.argv[2]
else:
app_id = input("Enter your APP ID: ")
with open(pem, 'rb') as pem_file:
signing_key = jwt.jwk_from_pem(pem_file.read())
payload = {
'iat': int(time.time()),
'exp': int(time.time()) + 600,
'iss': app_id