Scala 使用jwtCirce解码jwt令牌时失败(java.lang.IllegalArgumentException:非法base64

Scala 使用jwtCirce解码jwt令牌时失败(java.lang.IllegalArgumentException:非法base64,scala,jwt,decoding,illegalargumentexception,circe,Scala,Jwt,Decoding,Illegalargumentexception,Circe,我目前正试图在某个akka http服务中构建oAuth 2身份验证。我想与jwtCirce一起用于解码web令牌。在控制台(以及在我的测试中)中尝试时,我得到错误失败(java.lang.IllegalArgumentException:非法base64字符2d) 以下是描述问题的控制台会话: scala> import java.time.Instant import java.time.Instant scala> import cats.syntax.either._ im

我目前正试图在某个akka http服务中构建oAuth 2身份验证。我想与jwtCirce一起用于解码web令牌。在控制台(以及在我的测试中)中尝试时,我得到错误
失败(java.lang.IllegalArgumentException:非法base64字符2d)

以下是描述问题的控制台会话:

scala> import java.time.Instant
import java.time.Instant

scala> import cats.syntax.either._
import cats.syntax.either._

scala> import io.circe._, syntax._, jawn.{parse => jawnParse}
import io.circe._
import syntax._
import jawn.{parse=>jawnParse}

scala> import pdi.jwt.{JwtCirce, JwtAlgorithm, JwtClaim}
import pdi.jwt.{JwtCirce, JwtAlgorithm, JwtClaim}

scala> val privateKey = "MIIEpgIBAAKCAQEAvIWfxSuGXxUuVMHQaChB/bCOlRn3pJPZUHsC4vhcaRv7v9wWnZyVx36dsQ/BHB2icmfeVln6kXL8PSCAJcavO1cIXeHlJO9wlKKejZCcyu8v4dQn8bEFllFaIHt5yjfT9Kq3Tq5AJ9a6AdzkmUiGdrmMqQcHV0zKLMTdLLIl2sN72ZmkWCkilMacdLBjrLhIawOUfCngG57axiXEFOqjhWsumBEeV5yqIfgW335ASMSttEXtc418IRotD0rQEIX4UH78XuV6Lo7BWDjiAz0F0haMnPJhC/AMQGvgk2Yg6EVYxRueMMm6enNQ3ml0BJ71KmB/yFiivA1s6+f9PGvYMwIDAQABAoIBAQCerXIvSVVOjstyd7ftE4WH/KXmhfbVRcSyYvepBxbxOaaKdLtsajH/umkMcZA/FAp5dUfFMvMencQFx2dVZIh1z+mw68QtdIQz9zSxPzlZ7j1FPYdpfXCQd2T+1i9Kr/bthwvHZA+H+MqTatPW2R6kq8TjOJFLP80kJYdsaX5HRLMbZQyfVvMNpb9Qb1iSTY7r3dHsZ99x0GGkEiY4+g3qhPri2Fn+N64+CBg8EXYM5OWGOFUgtGn+xKP8YJW2t3roOQlNcXcyBR4WZebrUr2Vtqm+I5OKYDz2ED+KQR9LvEq/mQtCk8Opqc/55nMbRCsI+v3uq91dI+Xmr360kNyxAoGBAPOeQRavLMR3ebeLfa1VZRiMg6uH2004zs02kEPcvkcOceUHGwJ4NB0yPPWbe7clD+1of3P5TiQHh1dW/1LjRxFjDSGUgf5oQeYbtcvKeTuBb0Ios3uRnpX2ylr94jIZjICNQDhnMCJfpG29L3kRGbKLpTBpIWuqapMcGmZabppHAoGBAMYagaACITbgsjM2AGQnH8wqz47DMrhNW9a0IJFnbOcAYs4Z6GoWXf67aH5HAAKxEBAmqIG7xPrEMnMbGLLkuyr7kmOvVohRD5sJaCLBdXBV7KMn8+3eZSR3sy/T3foqFZEquWwjUmlKS8i+PBBiVrhajp06lOCKLCHkH6b1Xxy1AoGBAMHu6iuvubiQz7FAdwSkJT18pljHZtm7bk1IsWGEeWjBZAOJO4Qkwn+3fXWbl8m81EgO1t8wyHbAE4qAs/J9ARcjPdHMkgs/Xa5bwsX/YbDwIeyN0At/abpB4ua6kvWFBydSypvb8SJ79r5xSzhaV5WduxulpTg7SmnfhliShteDAoGBALm5rAFZPc53RlogrKk4zOTa1hCgDHMhg5J8+XOYpU7E290iCPU81w60oLiS0/2yBr89nwlSAtCfFDU6GCPPsXIQvSPcBKJ0bM8LOKgs+28//0TPdi9yKxzPZBzY4ulgfyvEBGbPjrnLv9UKFMG/kFHyBHZ/r4f7wnhbqRkcPflpAoGBALOS+l6/k0YuA9ElQw/NmAq87qsMKVdsqrxaFwEJdaeg+S5rjq+33xInf8WFHLEoVzV1zbuGcvyaKAhXxSz87V0gxWEKtnvH698qDlnSVf2ehRcWQ7XX8OisnAoK83QGitUluetUZ00G08XfN6K+MkjiNOKJq63zybKga9L4nKQE"
privateKey: String = MIIEpgIBAAKCAQEAvIWfxSuGXxUuVMHQaChB/bCOlRn3pJPZUHsC4vhcaRv7v9wWnZyVx36dsQ/BHB2icmfeVln6kXL8PSCAJcavO1cIXeHlJO9wlKKejZCcyu8v4dQn8bEFllFaIHt5yjfT9Kq3Tq5AJ9a6AdzkmUiGdrmMqQcHV0zKLMTdLLIl2sN72ZmkWCkilMacdLBjrLhIawOUfCngG57axiXEFOqjhWsumBEeV5yqIfgW335ASMSttEXtc418IRotD0rQEIX4UH78XuV6Lo7BWDjiAz0F0haMnPJhC/AMQGvgk2Yg6EVYxRueMMm6enNQ3ml0BJ71KmB/yFiivA1s6+f9PGvYMwIDAQABAoIBAQCerXIvSVVOjstyd7ftE4WH/KXmhfbVRcSyYvepBxbxOaaKdLtsajH/umkMcZA/FAp5dUfFMvMencQFx2dVZIh1z+mw68QtdIQz9zSxPzlZ7j1FPYdpfXCQd2T+1i9Kr/bthwvHZA+H+MqTatPW2R6kq8TjOJFLP80kJYdsaX5HRLMbZQyfVvMNpb9Qb1iSTY7r3dHsZ99x0GGkEiY4+g3qhPri2Fn+N64+CBg8EXYM5OWGOFUgtGn+xKP8YJW2t3roOQlNcXcyBR4WZebrUr2Vtqm+I5OKYDz2ED+KQR9LvEq/mQtCk8Opqc/55nMbRCsI+v3uq91dI+Xmr360kNyxAoGBAPOeQRavLMR3ebeLfa1VZRiMg6uH2004zs02kEPcvkcOceUHGwJ4NB0yPPWb...
scala> val algo = JwtAlgorithm.RS384
algo: pdi.jwt.JwtAlgorithm.RS384.type = RS384

scala> val Right(claimJson) = jawnParse(s"""{"expires":${Instant.now.getEpochSecond}}""")
claimJson: io.circe.Json =
{
  "expires" : 1484816589
}

scala> val Right(header) = jawnParse( """{"typ":"JWT","alg":"RS384"}""")
header: io.circe.Json =
{
  "typ" : "JWT",
  "alg" : "RS384"
}

scala> val token = JwtCirce.encode(header, claimJson, privateKey)
token: String = eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJleHBpcmVzIjoxNDg0ODE2NTg5fQ.EQElbsrEtfxu1NLjYehKkpxiJrBMAcMx-pV7Zf0s_AHEBt3pBoEguxmcBYLdxPW9h_0K45pd2awee5dxRSDpC4Hdf4RN731IY0Ya8UfGe8og27t7qHuTVqm0jVGVlCOhtF4JQpu6TX84uvfxvJb0re8flc_MzLWkL78kkwBFO6AfyDSkGNHRdYJ3z_vi2LpUCSHXWPRluKAv8dZ32u4MIYaLlQYfpSW4k7aUy7Oopa-eN2albr1icf-Eik9AtpdZS3z8BosgVuOWg3_UlwFVFnKhU73t5ogwN--KEnXDkf66DcG2VrqT_oxHtskF1CG6dMxy5wMWPfEpL-emHsBrmg

scala> val pubKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8hZ/FK4ZfFS5UwdBoKEH9sI6VGfekk9lQewLi+FxpG/u/3BadnJXHfp2xD8EcHaJyZ95WWfqRcvw9IIAlxq87Vwhd4eUk73CUop6NkJzK7y/h1CfxsQWWUVoge3nKN9P0qrdOrkAn1roB3OSZSIZ2uYypBwdXTMosxN0ssiXaw3vZmaRYKSKUxpx0sGOsuEhrA5R8KeAbntrGJcQU6qOFay6YER5XnKoh+BbffkBIxK20Re1zjXwhGi0PStAQhfhQfvxe5XoujsFYOOIDPQXSFoyc8mEL8AxAa+CTZiDoRVjFG54wybp6c1DeaXQEnvUqYH/IWKK8DWzr5/08a9gz"
pubKey: String = ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8hZ/FK4ZfFS5UwdBoKEH9sI6VGfekk9lQewLi+FxpG/u/3BadnJXHfp2xD8EcHaJyZ95WWfqRcvw9IIAlxq87Vwhd4eUk73CUop6NkJzK7y/h1CfxsQWWUVoge3nKN9P0qrdOrkAn1roB3OSZSIZ2uYypBwdXTMosxN0ssiXaw3vZmaRYKSKUxpx0sGOsuEhrA5R8KeAbntrGJcQU6qOFay6YER5XnKoh+BbffkBIxK20Re1zjXwhGi0PStAQhfhQfvxe5XoujsFYOOIDPQXSFoyc8mEL8AxAa+CTZiDoRVjFG54wybp6c1DeaXQEnvUqYH/IWKK8DWzr5/08a9gz

scala> JwtCirce.decodeJsonAll(token, pubKey, Seq(JwtAlgorithm.RS384))
res3: scala.util.Try[(io.circe.Json, io.circe.Json, String)] = Failure(java.lang.IllegalArgumentException: Illegal base64 character 2d)
有人知道我做错了什么吗

提前谢谢你的帮助


Cheers Bernhard

2d
是字符
-
。似乎您的解码器正在尝试解析base64编码的字符串,但JWT是用base64url编码的。base64url编码将base64
+
替换为
-
,将
/
替换为
-
,并删除尾随的
=/code>。我不知道为什么我也认为它与base64 vs base64url有关,但我也不知道如何尝试,更不用说修复它了。我已经查看了源代码,但找不到任何提示,文档中的示例也没有显示任何关于RS384的内容。可能是公钥的问题。您的库可能需要pkcs#1编码密钥ssh-rsa密钥的ad