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"
使用除以 1000
和 Math.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" })
我正在尝试通过 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"
使用除以 1000
和 Math.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" })