Node.js GitHub API在尝试生成访问令牌时返回401

Node.js GitHub API在尝试生成访问令牌时返回401,node.js,github-api,github-app,Node.js,Github Api,Github App,我正试图通过GitHub API为我的GitHub应用程序生成访问令牌 我收到401未经授权的响应错误: 过期时间”索赔('exp')在未来太远了 我的代码: const now = Date.now() const expiration = now + 60 * 10 // JWT expiration time (10 minute maximum) const payload = { iat: now exp: expiration, iss: appId } const

我正试图通过GitHub API为我的GitHub应用程序生成访问令牌

我收到401未经授权的响应错误:

过期时间”索赔('exp')在未来太远了

我的代码:

const now = Date.now()
const expiration = now + 60 * 10 // JWT expiration time (10 minute maximum)

const payload = {
  iat: now
  exp: expiration,
  iss: appId
}

const jwt = jwtGenerator(payload, privatePem, { algorithm: "RS256" })

Github文档-

Github可能希望在
exp
下有一个以秒为单位的纪元时间。 如果你看ruby示例,他们使用
Time.now.to_i
返回以秒为单位的历元时间。 Javascript的
Date.now()
返回的历元时间(毫秒)太大,您应该尝试将
Date.now()除以1000,例如:

const now=(Date.now()/1000)
const expiration=now+(60*10)//JWT过期时间(最多10分钟)
常数有效载荷={
iat:现在
exp:到期,
iss:appId
}
const jwt=jwtGenerator(有效载荷,privatePem,{算法:“RS256”})

jsonwebtoken
的文档特别提到:


使用除以
1000
Math.floor
进行适当的整数转换-我能够让GithubAPI使用
jwt.sign

我找到了问题所在

不同机器上的时间不同步。 为了解决这个问题,我在过去将iat时间设置为30秒(我尝试了不同的时间跨度,但结果证明30秒效果最好)


您在nodeJS中使用哪个包作为jwtGenerator
“jsonwebtoken”:“^8.5.1”
jwtGenerator
它只是一个包装
jsonwebtoken
sign
函数的函数好主意,我也试过了,但似乎这不是问题所在,两种格式都适用
const now = Math.floor(Date.now() / 1000) - 30
const expiration = now + 60 * 10 // JWT expiration time (10 minute maximum)

const payload = {
  iat: now,
  exp: expiration,
  iss: appId
}

const jwt = jwtGenerator(payload, privatePem, { algorithm: "RS256" })