我正在使用Keycloak 4.8.0作为身份验证服务器。我已经配置了一个发布使用EC512签名的JWT的领域。我通过提供用户的客户端ID,客户端密钥,用户名和密码,通过端点https://example.com/auth/realms/myrealm/protocol/openid-connect/token
获得令牌。
通过https://example.com/auth/realms/myrealm/protocol/openid-connect/token/introspect
使用Keycloak自检JWT时,它显示为有效。然后,我在LoopREST 4之上构建了一个Node.js应用程序,该应用程序提供了REST服务。在那里,我想用passport-jwt
验证获得的JWT。我提供了公共密钥,但是总是出现错误TypeError: "ES512" signatures must be "132" bytes, saw "138"
。 (有趣的是,使用Keycloak 4.7.0时,错误是TypeError: "ES512" signatures must be "132" bytes, saw "139"
。)
因此签名似乎无效。例如。 https://jwt.io能够解码JWT,但在提供公钥时也不会显示有效的签名。公钥可能无效。除了从管理控制台复制密钥外,我还使用https://example.com/auth/realms/myrealm/protocol/openid-connect/certs
来检索密钥。然后,我借助this answer将其转换为PEM。键匹配。
所以我有点不知所措。当然,Keycloak可能会生成无效的签名,但我对此表示怀疑。我很可能在域配置上做错了什么,但我看不到哪里。
对于任何想在此处验证签名的人来说,都是我如上所述获得的示例JWT:
eyJhbGciOiJFUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJwdEVYeWpnbGlwdlp3OGRXSUc1Ml8xNFpONTdnWHNtWUdrdUVJSEplSVJrIn0.eyJqdGkiOiJiNmI1NTI4Ni0zY2NiLTRiNzQtYWFlZC1hOGI2MzBiZjQ5NmEiLCJleHAiOjE1NDUwODM0NjYsIm5iZiI6MCwiaWF0IjoxNTQ1MDgzMTY2LCJpc3MiOiJodHRwczovL2F1dGguaW5tYXQubG9jL2F1dGgvcmVhbG1zL2lubWF0IiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjViNWQ5NmI1LTBmZjgtNDAyYi05NDAxLTQyYTExODAzMjFlZiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlubWF0IiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiZjAxMmIzOTMtYTY0Ny00ZDhkLTk4MDQtZDQ3MzNkM2Y4MjVjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdGVyIiwiZW1haWwiOiJ0ZXN0ZXJAdGVzdC5jb20ifQ.MIGIAkIBzvH1R-9fNFp8jlw-TeFidmC03uNov6IhDc23XMB9eHga8zdF4ybDmxDoAkB-NAJnDRUDNCtw3ooRxNSApje9oCkCQgHkrbYSN3L5LBA1OM5yb9WSQVaxItcspnCtMtW1QogaAYp0v9JwQA7VHL6ofEp3pcXLaKnFzVgP6FvDCwGgIJGFfw
这是我从管理控制台复制的公用密钥:
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQtc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0Yp4p+ZrMxlaYdSMuDyU=
由于passport-jwt
希望使用PEM格式,因此我将其输入到库中,如下所示:
-----BEGIN PUBLIC KEY-----
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQ
tc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs
4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0
Yp4p+ZrMxlaYdSMuDyU=
-----END PUBLIC KEY-----
更新:使用RS256时,我得到签名进行验证。因此,这确实可能是Keycloak错误。