我正在尝试为我的Web应用程序实现单一登录。我正在使用gravitee.io进行访问管理和令牌生成。 我遵循了gravitees quickstart tutorial中的步骤,现在我要验证我的id_token。
为此,我正在使用node-jsonwebtoken库。我在后端使用total.js(应该没那么重要,但我仍然想提一下)。
到目前为止我做了什么。 在total.js配置文件中,我有我的客户ID和我的客户秘密以及域秘密
./ configs / myconfig.conf(密钥/秘密已更改)
url : https://sso.my-graviteeInstance.com/am
client-id : myClientId
client-secret : uBAscc-zd3yQWE1AsDfb7PQ7xyz
domain : my_domain
domain-public-key : EEEEEB3NzaC1yc2EAAAADAQABAAABAQCW4NF4R/sxG12WjioEcDIYwB2cX+IqFJXF3umV28UCHZRlMYoIFnvrXfIXObG7R9W7hk6a6wbtQWERTZxJ4LUQnfZrZQzhY/w1u2rZ3GEILtm1Vr1asDfAsdf325dfbuFf/RTyw666dFcCcpIE+yUYp2PFAqh/P20PsoekjvoeieyoUbNFGCgAoeovjyEyojvezxuTidqjaeJvU0gU4usiiDGIMhO3IPaiAud61CVtqYweTr2tX8KabeK9NNOXlTpLryBf3aTU1iXuU90mijwXZlmIzD28fWq+qupWbHcFZmmv3wADVddnxZHnFIN7DHGf5WVpb3eLvsGkIIQpGL/ZeASDFa
我添加了一个模型来处理total.js的登录工作流程,以便通过REST调用从gravitee获取jwt令牌。 到目前为止,一切正常。创建一个会话并将响应存储在其中。 gravitee响应是如下所示的预期json
{
access_token: 'some-long-token',
token_type: 'bearer',
expires_in: 7199,
scope: 'openid',
refresh_token: 'another-long-token',
id_token: 'last-long-token'
}
我将令牌拆分为单独的cookie,因为当我尝试将其保存为单个cookie时,出现一个错误,告诉我cookie超过了4096个长度限制。
到目前为止,一切正常。在前端ajax调用中,将执行成功回调,只需将window.location.href='/';
设置为调用应用程序的仪表板即可。我将此路由设置为仅在获得授权时才可访问,以便在调用仪表板时,totaljs会调用onAuthorize函数。
F.onAuthorize = function (req, res, flags, callback) {
let cookie = mergeCookies(req.cookie);
// Check the cookie length
if (!cookie || cookie.length < 20) {
console.log(`cookie not defined or length to low`);
return callback(false);
}
if (!cookie) {
console.log(`cookie undefined`);
return callback(false);
}
// Look into the session object whether the user is logged in
let session = ONLINE[cookie.id];
if (session) {
console.log(`there is a session`);
// User is online, so we increase his expiration of session
session.ticks = F.datetime;
jwt.verify(
session.id_token,
Buffer.from(CONFIG('client-secret')).toString('base64'),
function(err, decoded){
if (err) {
console.log(`jwt verify error: ${err}`);
return callback(false);
}
console.log(`decoded token user id: ${decoded.sub}`);
return callback(true, session);
})
}
console.log(`false`);
callback(false);
};
我也尝试只发送CONFIG('client-secret')
而不进行缓冲。我还尝试发送CONFIG('domain-public-key')
。但是我得到的错误总是一样的:
jwt verify error: JsonWebTokenError: invalid algorithm
当我将id_token复制并粘贴到jwt.io的调试器中且算法蜂鸣设置为RS256时,我将看到以下解码值:
// header
{
"kid": "default",
"alg": "RS256"
}
// payload
{
"sub": "some-generated-id",
"aud": "myClientId",
"updated_at": 1570442007969,
"auth_time": 1570784329896,
"iss": "https://sso.my-graviteeInstance.com/am/my_domain/oidc",
"preferred_username": "myUsername",
"exp": 1570798729,
"given_name": "Peter",
"iat": 1570784329,
"family_name": "Lustig",
"email": "peter.lustig@domain.com"
}
我将公钥从我的域复制到相应的文本字段中,并且我还尝试使用客户端秘密。不管我做什么,我得到的错误都是
警告:看来您的JWT签名未使用正确编码 base64url(https://tools.ietf.org/html/rfc4648#section-5)。注意 填充(“ =”)必须按照 https://tools.ietf.org/html/rfc7515#section-2
当我尝试在后端验证令牌并在jwt.io调试器上出现一些编码错误时,我不明白为什么会出现算法错误。
有人可以向我解释如何解决此问题吗?提前致谢 帕斯卡
编辑:更改标题