在Kotlin中验证签名JWT.IO

时间:2020-09-23 16:01:37

标签: android-studio kotlin jwt

我需要使用jwt.io验证令牌

为此,我有一个令牌(许可证) “ eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRJZCI6MjcwMzYwLCJwYWNrYWdlc ..........”

和一个json(证书)

“键”:[ { “ kid”:“ 1”, “ e”:“ AQAB”, “ kty”:“ RSA”, “ alg”:“ RS256”, “ n”:“ rXYc2Ehtb42R83kLIw56biI / ABOp03lzbYHdXI0caeli .......”, “使用”:“签名” }

在jwt.io站点的调试器中,收到此信息后,我收到“签名已验证”的信息。

我正在网上寻找一些可以让我做同样事情的脚本

与jwt.io站点上的相同,我发现我可以使用此处报告的代码https://github.com/PhilJay/JWT,但是,如果我理解正确,它不使用RS256算法,而是使用ES256,因此不起作用。

我正在尝试相同的操作,但老实说,我不理解示例中解码器的要求

val有效= JWT.verify(tokenString,jwk,解码器) 我相信前两个是我拥有的数据。

您能给我一些建议还是给我一些其他代码来验证签名?

1 个答案:

答案 0 :(得分:1)

问题在这里

val nInt = Biginteger(1,Base64.getUrlDecoder()。decode(n))

您只需要获取cert的元素n,而不是全部cert(json)

        val e = obj_cert.asJsonObject["e"].asString
        val n = obj_cert.asJsonObject["n"].asString.replace('+', '-').replace('/', '_').replace("=", "")
        val eInt = BigInteger(1, Base64.getUrlDecoder().decode(e))
        val nInt = BigInteger(1, Base64.getUrlDecoder().decode(n))

        val spec = RSAPublicKeySpec(nInt, eInt)
        val publicKey =    KeyFactory.getInstance("RSA").generatePublic(spec) as RSAPublicKey

        val algorithm: Algorithm = Algorithm.RSA256(publicKey, null)
        val verifier: JWTVerifier = com.auth0.jwt.JWT.require(algorithm).build()

        verifier.verify(license)