我的jwt承载令牌与邮递员一起返回error =“ invalid_token”,error_description =“令牌已过期”

时间:2020-04-04 03:35:08

标签: .net-core jwt postman

我正在关注有关微服务的教程。我明白了将承载令牌用于基本授权模型。我创建了令牌并设置了所有属性,但是当我尝试使用令牌时,它给了我错误:Bearer error="invalid_token", error_description="The token expired at '04/03/2020 21:47:31'"甚至是当前的21:42,因此它实际上没有过期。

我只是检查以下网址: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 个答案:

答案 0 :(得分:1)

可能的问题是您使用的centuryBegin不是UTC时代-DateTime构造函数默认假定其KindDateTimeKind.Unspecified,并调用{{ 1}}不会改变.NET假定它代表您当地时区1970年1月1日的时间实例的事实。

因此,为了正确表示纪元,您应该使用:

ToUniversalTime()

或者,您可以改用var centuryBegin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 类,因为它更适合表示绝对时间,并且它还具有便捷的方法DateTimeOffset

DateTimeOffset.ToUnixTimeSeconds()