GitHub API возвращает 401 при попытке сгенерировать токен доступа
Я пытаюсь создать токен доступа для своего приложения 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/
2 ответа
Я понял, в чем проблема.
Время на разных машинах не синхронизировалось. Чтобы решить эту проблему, я установил время 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 может ожидать эпоху в секундах ниже exp
. Если вы посмотрите на пример рубина, который они используют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 г. [POSIX.1] определение "секунды с начала эпохи"
Используя разделить на 1000
а также Math.floor
для правильного преобразования целых чисел - мне удалось заставить GithubAPI работать с jwt.sign
.