【问题标题】:Read expiration date from jwt token从 jwt 令牌中读取到期日期
【发布时间】:2017-02-25 18:09:20
【问题描述】:

我正在使用 jwt-core 库(“com.pauldijou” %% “jwt-core” % “0.11.0”)。我得到了一个 JWT 令牌,我想从令牌中读取到期日期。

我查看了他们在 github 网站上的示例,他们有一些角度和游戏框架示例。

https://github.com/pauldijou/jwt-scala/tree/master/examples

我只想要简单的 scala 代码。不涉及 UI 框架。你能指出一个帮助我从 jwt 令牌中提取过期时间戳的示例吗?

【问题讨论】:

    标签: scala jwt


    【解决方案1】:

    JWT 只不过是一个经过编码和签名的base64 string

    我无法帮助您从 JWT 中提取到期日期,但我可以帮助您完成从 获取 到期日期的步骤一个智威汤逊。


    这是一个示例令牌:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTIzNDIzNDIzNH0.ADaAdqIjKzQ4uPlavizyGyng2Vq1yQqYjcZ-EeqN8Do
    

    您可以通过复制示例并在jwt.io使用代码secret进行解码来检查解码版本

    JWT 的第二部分是您的有效负载,到期日期最有可能存在。您需要检查提供者端的有效负载定义并了解其属性。

    现在,对于 Scala 部分:

    首先,将 JWT 格式化为 JSON -- JWT: JSON Web Token -- 您需要选择一个 JSON 序列化器/反序列化器库。对于这个例子,我使用spray-json

    import java.util.Base64
    import spray.json._
    
    case class Payload(sub: String, name: String, admin: Boolean, exp: Int) // exp is the expiration date
    
    object ExpirationDateTest extends DefaultJsonProtocol {
    
    implicit val payloadJsonFormat: RootJsonFormat[Payload] = jsonFormat4(Payload) // defines a contract to deserialize the JSON object
    
    val jwtToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTIzNDIzNDIzNH0.ADaAdqIjKzQ4uPlavizyGyng2Vq1yQqYjcZ-EeqN8Do"
    
    val jwtTokenPayload = jwtToken.split('.')(1)
    
    val expirationDate = new String(Base64.getDecoder.decode(jwtTokenPayload)).parseJson.convertTo[Payload].exp
    
    def getExpirationDate: Int = {
       expirationDate
    }
    }
    println(ExpirationDateTest.getExpirationDate)
    

    结果:

    1234234234

    使用的喷雾库是:"io.spray" %% "spray-json" % "1.3.2"

    【讨论】:

      【解决方案2】:

      感谢您的回答。使用 scala-jwt 库也很容易。

      import pdi.jwt._
      import scala.util.{Failure, Success}
      import io.circe.generic.auto._
      import io.circe.parser._
      
      val expTimeOpt = Jwt.decode(token, JwtOptions(signature = false, expiration = true, notBefore = false, leeway = 0)) match {
         case Success(s) => decode[JwtExpiration](s).fold[Option[JwtExpiration]](_ => Option.empty[JwtToken], Some(_))
         case Failure(f) => Option.empty[JwtExpiration]
      }
      
      case class JwtExpiration(exp: Long)
      

      【讨论】:

      • 我通过pdi.jwt 找到JwtExpiration 但没有找到。只有 JwtExpirationException 可用。
      猜你喜欢
      • 2017-01-22
      • 2018-07-20
      • 2021-12-21
      • 2017-05-30
      • 2017-03-04
      • 2019-07-04
      • 2016-04-27
      • 2018-01-06
      • 2019-10-27
      相关资源
      最近更新 更多