Я пытаюсь проверить утверждения JWT с помощью модуля GatewayScript JWT в IBM DataPower. Это отлично работает для проверки утверждений, но я также хочу проверить подпись JWT. В идеале я хочу добиться этого с помощью набора JWK.
Ключ выглядит следующим образом:
{
"kty": "RSA",
"use": "sig",
"kid": "",
"x5t": "",
"n": "",
"e": "",
"x5c": [
""
],
"issuer": ""
}
JWT проверяется на соответствие дочернему элементу для получения необходимого JWK из набора. Затем я использую этот ключ в методе .addOperation(validate, key)
. Но перед этим я проверяю, является ли ключ JWK, и конвертирую его вBuffer. Проблема в том, что я всегда получаю эту ошибку:
Ошибка: формат данных для JOSE parse() неверен.
var options = {
validateDataType: false,
validateAudience: true,
validateExpiration: true,
validateNotBefore: true
};
var params = {
'aud': session.parameters.azureClientId,
'tid': session.parameters.azureIssuer
};
console.info(jwk.isJWK(key)); // is true
//var lop = jwk.toBuffer(key); // tried with this but failed
var skey= JSON.stringify(key); // also failed
var decoder = new jwt.Decoder(oauthToken);
decoder.addOperation(options, 'validate', params)
.addOperation('verify', skey)
.decode(function(error, claims){
if (error) {
console.error('Introspection failed: ' + error);
session.reject('IntrospectionError');
session.output.write(XML.parse(`<declined/>`));
} else {
oauthctx = true;
console.info('Introspection successfull');
session.output.write(XML.parse(`<approved/>`));
}
});
Я перепробовал очень многое и не знаю, что делаю не так.
Теперь я нашел альтернативный способ проверить подпись. Он предполагает использование криптомодуля и модуля jwk.
Документация достаточно подробно описана. Дополнительно хотелось бы отметить, что существует документация по ключам, конкретно как и в каких типах данных должны быть структурированы ключи.
var crypto = require('crypto');
var jwk = require('jwk');
var verify = crypto.createVerify('rsa-sha256'); // Note, there are others
var [header, payload, signature] = oauthToken.split('.');
verify.update(header+"."+payload);
var key = jwk.toBuffer(key);
verify.verify(key, signature, function(error) {
if (error) {
console.info(error);
} else {
console.info("WORKED");
}
});