Мой токен на предъявителя jwt возвращает error = "invalid_token", error_description = "Маркер истек" с почтальоном - PullRequest
0 голосов
/ 04 апреля 2020

Я слежу за учебником по микросервисам. Я дошел до того, что использовал токены на предъявителя для базовой модели авторизации c. Я создаю токен и устанавливаю все свойства, но когда я пытаюсь использовать токен, он выдает мне ошибку: Bearer error="invalid_token", error_description="The token expired at '04/03/2020 21:47:31'", даже если в настоящее время он имеет значение 21:42, так что срок его действия фактически не истек.

Я просто проверяю это url: https://localhost: 5001 / api / Activities / GetActivity

Может ли быть проблема с почтальоном, я уже пытался сменить издателя, добавив более 5 минут, добавив больше заголовков в почтальон и не повезло.

Это моя функция для создания токена:

 public CustomJsonWebToken Create(Guid userId)
        {
            var nowUtc = DateTime.UtcNow;
            var expiration = nowUtc.AddMinutes(jwtOptions.ExpiryMinutes);
            var centuryBegin = new DateTime(1970, 1, 1).ToUniversalTime();
            var exp = (long)(new TimeSpan(expiration.Ticks - centuryBegin.Ticks).TotalSeconds);
            var now = (long)(new TimeSpan(nowUtc.Ticks - centuryBegin.Ticks).TotalSeconds);
            var payload = new JwtPayload
            {
                {"sub", userId},
                {"iss", jwtOptions.Issuer},
                {"iat", now},
                {"exp", exp},
                {"unique_name", userId}
            };
            var jwt = new JwtSecurityToken(jwtHeader, payload);
            var token = jwtSecurityTokenHandler.WriteToken(jwt);

            return new CustomJsonWebToken
            {
                Token = token,
                Expire = exp
            };
        }

1 Ответ

1 голос
/ 04 апреля 2020

Вероятная проблема в том, что centuryBegin, который вы использовали, не является UT C Epoch - конструктор DateTime по умолчанию предполагает, что его Kind равен DateTimeKind.Unspecified, и вызов ToUniversalTime() не изменится тот факт, что. NET предполагает, что он представляет момент времени на 1 января 1970 в вашем местном часовом поясе .

Так что для правильного представления эпохи вам, вероятно, следует использовать:

var centuryBegin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

В качестве альтернативы вы можете использовать класс DateTimeOffset вместо этого, поскольку он больше подходит для представления абсолютного времени, а также имеет удобный метод DateTimeOffset.ToUnixTimeSeconds():

var nowUtc = DateTimeOffset.UtcNow;
var expiration = nowUtc.AddMinutes(jwtOptions.ExpiryMinutes);
var exp = expiration.ToUnixTimeSeconds();
var now = nowUtc.ToUnixTimeSeconds();
...