【问题标题】:My jwt bearer token returns error="invalid_token", error_description="The token expired" with postman我的 jwt 不记名令牌返回 error="invalid_token", error_description="The token expired" with postman
【发布时间】:2020-07-16 07:20:08
【问题描述】:

我正在学习有关微服务的教程。我已经到了将不记名令牌用于基本授权模型的地步。我创建了令牌并设置了所有属性,但是当我尝试使用令牌时,它给了我错误: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
            };
        }

【问题讨论】:

    标签: .net-core jwt postman


    【解决方案1】:

    可能的问题是您使用的 centuryBegin 不是 UTC 纪元 - 默认情况下,DateTime 构造函数假定其 KindDateTimeKind.Unspecified,并且调用 ToUniversalTime() 不会改变这一事实.NET 假定它代表 1970 年 1 月 1 日的时间实例在您当地的时区

    因此,为了正确地表示时代,您可能应该使用:

    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();
    

    【讨论】:

    • 非常感谢,效果很好,我不知道那门课,我还有很多东西要学!万分感谢。只是一个问题,你介意告诉我使用 ToUnixSeconds 而不是只使用 nowUtc.AddMinutes(jwtOptions.ExpiryMinutes); 有什么好处吗?作为到期时间?
    • @Teler ToUnixTimeSeconds 只是为您节省了减去两次以获得 Unix 时间戳的工作量。您仍然需要nowUtc.AddMinutes(jwtOptions.ExpiryMinutes) 首先创建过期时间。
    • 有关DateTimeDateTimeOffset的更详细讨论,您可以在Microsoft Docs上查看this guide
    猜你喜欢
    • 2022-07-12
    • 2022-10-25
    • 2021-07-26
    • 2021-09-06
    • 2018-08-03
    • 1970-01-01
    • 2014-10-20
    • 2023-01-27
    • 2020-12-24
    相关资源
    最近更新 更多