jsonwebtoken verify使用keycloft中的JWT提供无效签名,并使用javascript中的json



我成功地从以下对密钥斗篷的调用中接收到访问令牌:

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"] });

我错过了什么?

我最近刚刚在NestJS应用程序中使用jsonwebtoken npm包完成了这项工作。以下解决了问题:

  1. 请在此处查看答案->https://stackoverflow.com/a/64484150-这解释了从哪里获得实际的客户端机密,因为它没有显示在Key斗篷接口的任何地方,所以只能通过SQL命令从Key斗篷数据库中检索机密

  2. 一旦你有了,你需要把你的验证电话改成这样:

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

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

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

最新更新