3

我正在尝试通过 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/

4

2 回答 2

3

我弄清楚了问题所在。

不同机器上的时间不同步。为了解决这个问题,我将 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" })
于 2020-05-18T15:18:52.690 回答
0

Github 可能会期待一个以秒为单位的纪元时间exp。如果您查看他们使用的 ruby​​ 示例,Time.now.to_i它会以秒为单位返回一个纪元时间。JavascriptDate.now()以毫秒为单位返回的纪元时间太大,您应该尝试除以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] 定义“自纪元以来的秒数”

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

于 2020-05-13T10:01:04.690 回答