Значения iat
и exp
действительно выражены в секундах с эпохи Unix. Поскольку эпоха Unix основана на UTC, то же самое относится и к этим значениям. Вы преобразуете их в Date
объекты правильно.
var iat = new Date(1572468316 * 1000);
var exp = new Date(1572468916 * 1000);
console.log(iat.toISOString()); //=> "2019-10-30T20:45:16.000Z"
console.log(exp.toISOString()); //=> "2019-10-30T20:55:16.000Z"
Функция toISOString
генерирует строку в формате ISO 8601, представленную как UTC (как указано конечным символом Z
).
Формат вывода, который вы задали в своем вопросе, заключается в том, что произойдет при вызове функции toString
или при непосредственном протоколировании объекта Date
в среде, которая выбирает запись вывода toString
. Поскольку разные среды могут испускать разные форматы (некоторые по местному времени, некоторые в UTC, некоторые в ISO 8601, некоторые в нестандартном формате) - не рекомендуется напрямую регистрировать объект Date
.
вывод toISOString
показывает, что JWT действовал в течение 10 минут, с 2019-10-30 20:45:16 UTC до 2019-10-30 20:55:16 UTC. Нет другого способа интерпретировать эти результаты.
Ваш вывод по местному времени показывает трехчасовое преобразование, которое будет правильно соответствовать смещению часового пояса UTC-3, снова подтверждая, что их значения анализируются правильно.
Если это не то, что вы ожидали, токен был выдан неправильно. Происходит одна из двух вещей:
В коде, генерирующем JWT, может быть ошибка, связанная с использованием локального времени вместо UTC в качестве основы для созданияотметка времени.
На сервере, на котором запущен код, в котором был сгенерирован JWT, часы могут быть установлены неправильно.
Второй вариант более вероятен,Например, это может произойти, когда администратор сервера устанавливает часовой пояс в формате UTC, но устанавливает часы на основе местного времени. Вместо этого убедитесь, что часы на сервере настроены на автоматическую синхронизацию времени из Интернета, и проблема, скорее всего, исчезнет.
Что касается подхода, упомянутого в комментариях к вопросу - не делайте этого. Вычитание смещения часового пояса таким образом не корректно корректируется для часовых поясов, а скорее выбирает другой момент времени. Может показаться, что он дает правильные результаты, но вы найдете крайние случаи перехода на летнее время во многих часовых поясах, и у вас возникнут проблемы, когда JWT начнут генерироваться с правильными значениями.