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.

Другие вопросы по тегам