GitHub API returns 尝试生成访问令牌时出现 401

GitHub API returns 401 while trying to generate access token

我正在尝试通过 GitHub API 为我的 GitHub 应用生成访问令牌。

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

expiration time' claim ('exp') is too far in the future

我的代码:

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 文档 - https://developer.github.com/apps/building-github-apps/authenticating-with-github-apps/

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

const now = (Date.now() / 1000)
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" })

jsonwebtoken 的文档特别提到:

IEEE Std 1003.1, 2013 Edition [POSIX.1] definition "Seconds Since the Epoch"

使用除以 1000Math.floor 进行正确的整数转换 - 我能够获得 GithubAPI 来处理 jwt.sign.

我知道问题出在哪里了。

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

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" })