代码之家  ›  专栏  ›  技术社区  ›  Riduidel

我的id提供程序返回一个keydepot不理解的值。我能做什么?

  •  0
  • Riduidel  · 技术社区  · 6 年前

    当我尝试登录时,key斗篷发送一个身份验证反向通道请求,OAuth服务器用JWT回复该请求。

    当解码这个JWT时,keydrope会失败,出现这个异常

    Caused by: com.fasterxml.jackson.core.JsonParseException: Numeric value (1539167070926) out of range of int
     at [Source: (byte[])"{"sub":"20008203","aud":"Test-Keycloak","amr":["pwd","mobile"],"iss":"oauth","exp":1539167070926,"iat":1539163470926,"jti":"d24e5a11-1931-45a7-b77a-0c935ea40df8"}"; line: 1, column: 97]
        at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804)
        at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:663)
        at com.fasterxml.jackson.core.base.ParserBase.convertNumberToInt(ParserBase.java:869)
        at com.fasterxml.jackson.core.base.ParserBase._parseIntValue(ParserBase.java:801)
        at com.fasterxml.jackson.core.base.ParserBase.getIntValue(ParserBase.java:645)
        at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:472)
        at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:452)
        at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        ... 80 more
    

    好像 exp 值太大。钥匙斗篷解码失败了吗?我的OAuth服务器是否发送了错误的值?我该怎么做才能正确地解码过期?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Michail Alexakis    5 年前

    事实上,自从JWT草案发布(2014年2月)以来,规范中的“exp”时间戳发生了变化。最终规范于2015年5月发布( https://tools.ietf.org/html/rfc7519#section-4.1.4 )只需要一个数字日期。

    因此,RFC并不指定数字表示的宽度,我假设这意味着(从应用程序的key斗篷的角度)我们应该使用一个足够宽的整数(64位),这样我们就不会溢出。

    由于Y2038问题(一个有符号的32位整数不能代表2038年1月19日之后的日期),这种情况在不久的将来会变得更烦人

        2
  •  1
  •   Riduidel    6 年前

    JWT spec states

    “exp”(expiration time)声明标识了到期时间,在此日期或之后,JWT不能被接受进行处理。处理“exp”索赔要求当前日期/时间必须早于“exp”索赔中列出的到期日期/时间。实现者可能会提供一些小的回旋余地,通常不超过几分钟,以说明时钟偏差。其值必须是包含IntDate值的数字。使用此声明是可选的。

    换句话说,什么时候 exp 如果已设置,则它必须是包含自EPOCH起秒数的int值。