【问题标题】:jsonwebtoken verify is giving invalid signature with JWT from keycloak and using jsonwebtoken npm in javascript to verify itjsonwebtoken verify 使用来自 keycloak 的 JWT 提供无效签名,并在 javascript 中使用 jsonwebtoken npm 来验证它
【发布时间】:2022-01-09 13:01:31
【问题描述】:

我从 keycloak 上的以下调用成功接收到访问令牌:

http://localhost/auth/realms/myrealm/protocol/openid-connect/token

using
clent_id=myclient
grant_type=password
username=someone
password=mypasswd
client_secret=1a5debfc-63c8-48e8-95cb-b42aa0187310

我可以在 jwt.io 上使用从这次调用中获得的令牌,并且它使用客户端密码正确验证。但是,以下代码总是使用相同的信息给我一个无效的签名错误:

const token = "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhOWY4NDhhYi05ZTllLTQ0ZDAtYWQ5NC1jN2VhMTBhMDMzOTIifQ.eyJleHAiOjE2Mzg1MDUwOTcsImlhdCI6MTYzODUwNDc5NywianRpIjoiMzYyZmJjNTgtMjM1Mi00YmM4LWE0NmUtMDliMGYzOTgzYzBhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MC9hdXRoL3JlYWxtcy9teXJlYWxtIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjhlMTM1NTZlLTc2M2MtNGQxOC05OGFlLWY0ZWQ1YWFjODFiZSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im15Y2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImYzMWUxM2NiLWUyZDgtNGIxZC04MTQzLTgxMmU3YmE0NTQ5NiIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1teXJlYWxtIiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsInNpZCI6ImYzMWUxM2NiLWUyZDgtNGIxZC04MTQzLTgxMmU3YmE0NTQ5NiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoiTWlrZSIsInByZWZlcnJlZF91c2VybmFtZSI6InNvbWVvbmUiLCJnaXZlbl9uYW1lIjoiTWlrZSIsImVtYWlsIjoic29tZW9uZUBzb21lZmFrZWRvbWFpbi5jb20ifQ.Ir2qhdGqJzbJPn8S9TzDP2RRmN207pc8y3UrD7cCD5Q";

const secret = "1a5debfc-63c8-48e8-95cb-b42aa0187310";
jsonwebtoken.verify(token, secret, { "algorithms": ["HS256"] });

我错过了什么?

【问题讨论】:

  • 客户端密钥不是验证令牌的关键!您在使用 jwt.io 时犯了一个常见错误,并认为它验证了签名,但结果是错误的。请阅读here 如何以正确的方式进行操作,您会发现您实际上无法使用给定的秘密进行验证。作为客户端,您不应该验证令牌,用于签名的秘密实际上是令牌颁发者的秘密。
  • 谢谢,我看到有一种方法可以通过查询获取 keycloak 上的秘密。我想验证令牌的唯一真正最佳实践方法是使用 keycloak 的 REST API?
  • 不要在 StackOverflow 上发布任何秘密。我希望您的示例代码中的一个是假的。

标签: jwt


【解决方案1】:

我最近在 NestJS 应用程序中使用 jsonwebtoken npm 包自己经历过这个问题。以下解决了这个问题:

  1. 在此处查看答案 -> https://stackoverflow.com/a/64484150 - 这说明了从何处获取实际客户端密码,因为它没有显示在 Keycloak 界面的任何地方,只能通过该 SQL 命令从 Keycloak 数据库中检索该密码

  2. 一旦你有了,你需要将你的验证调用更改为:

    jsonwebtoken.verify(token, Buffer.from(secret, 'base64'), { "algorithms": ["HS256"] });

这是必需的,因为来自数据库的客户端密码是 base64 编码的。

我使用这种方法来减少对 Keycloak 服务器的 /auth/realms/{{realm-id}}/protocol/openid-connect/userinfo 端点的调用,这会增加网络开销,但正如您在评论 Mike 中提到的那样,REST API 是一种有效的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2018-12-19
    • 2023-01-31
    • 2018-07-06
    • 2019-07-31
    • 2019-03-21
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多