【问题标题】:Kong JWT invalid signatureKong JWT 无效签名
【发布时间】:2017-07-18 10:35:40
【问题描述】:

我在我的 Web 应用程序中使用 API 来获取数据和显示。我需要在访问数据库之前对 API 进行身份验证/授权,所以我使用 Kong API Gateway 来验证/授权请求(API)。我是尝试在 Kong 中创建 jwt 插件,但在使用 JWT 验证请求时获得无效签名。

如何修复无效签名错误?我在 Linux 服务器中使用 Kong 0.10.3(我没有使用 docker 或 AWS)。

代码: 以下是我遵循的步骤:

Step 1.Created Kong API Route:
curl -X POST http://localhost:8001/apis/ \
   --data "name=Abc" \
   --data "uris=/API" \
   --data "upstream_url=http://*.*.*.*:1212" \
   --data "strip_uri=false"

Step 2.Created plugin
curl -X POST http://localhost:8001/apis/ABC/plugins \
    --data "name=jwt" 

Step 3.Created Consumer
curl -X POST http://localhost:8001/consumers \
    --data "username=xyz" 

Step 4.Created JWT credentials
curl -X POST http://localhost:8001/consumers/xyz/jwt -H "Content-Type: application/x-www-form-urlencoded"

Step 5.Send a request with the JWT(Using the JWT debugger at https://jwt.io)

curl http://localhost:8000/API/ABC?user=1 \
    -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4OTg2MTgwZTQ0ZGQ0ODBmOGU5YzBlODQ3OTQyNDk1YSJ9.sIquZPSmkU8t9RVC8PSBqB8hbs2Th0IIOgphp2iWn2E'

{"message":"Invalid signature"}

【问题讨论】:

    标签: jwt kong


    【解决方案1】:

    您是否已将 iss 添加到您的 JWT 令牌负载中,如 https://getkong.org/plugins/jwt/ 中所述?

    其次,声明必须包含已配置声明中的密钥(来自 config.key_claim_name)。默认情况下,该声明是 iss(颁发者字段)。将其值设置为我们之前创建的凭证的密钥。声明可能包含其他值。

    { 
      "iss": "a36c3049b36249a3c9f8891cb127243c"
    }
    

    【讨论】:

    • 即使我有 iss (这是消费者的关键),我也会遇到同样的错误。我的智威汤逊是eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjc1pqT1RMaGgxTU9pSVJuNlV1NlptVzR6T2tWb3pCUiIsInN1YiI6Im1haWx0bzptaWtlQGV4YW1wbGUuY29tIiwibmJmIjoxNTMwMTc3NTMwLCJleHAiOjE1MzAxODExMzAsImlhdCI6MTUzMDE3NzUzMCwianRpIjoiaWQxMjM0NTYiLCJ0eXAiOiJodHRwczovL2V4YW1wbGUuY29tL3JlZ2lzdGVyIn0.K3YlVqpn-O2E86WCj6NOSUT0ZB4wmeHAuK1Ahu-Bkjo。这是我用来签署 jwt rjrLDRC980cbjcGD8plbsIa2xzwpwsJZ 的秘密。我使用kjur.github.io/jsjws/tool_jwt.html检查了签名的有效性。
    【解决方案2】:

    我遇到了类似的问题,我在一个 java 应用程序中生成 JSON Web 令牌,它与 kong 消费者具有相同的秘密,并将“iss”放在声明中,但 Kong 仍然给了我无效的签名消息。

    在对https://jwt.io/ 进行一些测试以生成令牌后,我注意到 java 应用程序正在使用 base64 编码的秘密生成令牌,而 kong 正在等待不编码的秘密,因此将 config.secret_is_base64 = true 添加到 jwt 插件解决我的问题。

    【讨论】:

      【解决方案3】:

      有两种可能。 1) 令牌无效,即未正确生成。 2) 令牌有效,但未使用正确的验证密钥验证令牌。

      第 1 点提示 此外,当我在https://jwt.io/ 中解密令牌时,我看到标头为空

      第 2 点提示 您需要在创建 JWT 凭证时提供其他信息,例如 JWT 算法、令牌验证密钥。第 4 步。

      【讨论】:

        【解决方案4】:

        我知道你的问题已经解决了。但我为遇到此问题的任何人输入了我的解决方案。您应该将在消费者的 JWT 部分中创建的密钥作为创建令牌的值放在“iss”密钥中。我创建了一个图像来直观地描述它。请注意,“iss”是可以配置的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-29
          • 2020-01-21
          • 2018-01-24
          • 1970-01-01
          • 2018-06-14
          • 2019-08-04
          • 2018-05-08
          • 2019-01-02
          相关资源
          最近更新 更多