В настоящее время я пытаюсь проверить подпись JWT, используя открытый ключ RSA, созданный из URL-адреса JWKS. Для этого я использую некоторые объекты Java, но моя проблема в том, что верификатор Java Signature не просто принимает в качестве аргумента текстовую строку, декодированную в двоичную, а использует собственную проприетарную двоичную декодированную «подпись».
Так что мне просто интересно, что я могу сделать, чтобы преобразовать мою текстовую подпись в тип данных, ожидаемый функцией Java Signature verify()
.
Вот мой текущий код:
private function validate_jwt_signature(rc) {
var id_token = listToArray(rc.id_token, ".");
if (listToArray(id_token[2], "")[len(id_token[2])] != "=") {
id_token[2] = id_token[2] & "=";
}
var header = deserializeJSON(base64urldecode(id_token[1]));
var payload = deserializeJSON(base64urldecode(id_token[2]));
var body = id_token[1] & "." & id_token[2];
var signature = id_token[3];
cfhttp(url="https://lti-ri.imsglobal.org/platforms/53/platform_keys/48.json", method="GET", result="key");
var platformPubKey = deserializeJSON(key.filecontent).keys[1].n;
createObject( "java", "java.security.Security" )
.addProvider( createObject( "java", "org.bouncycastle.jce.provider.BouncyCastleProvider" ).init());
var platformPubKey = reReplace( platformPubKey, "-", "+", "all" );
var platformPubKey = reReplace( platformPubKey, "_", "/", "all" );
var pemKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA" & platformPubKey & "IDAQAB";
var publicKeySpec = createObject( "java", "java.security.spec.X509EncodedKeySpec" )
.init(binaryDecode( pemKey, "base64" ));
var publicKey = createObject( "java", "java.security.KeyFactory" )
.getInstance( javaCast( "string", "RSA" ) )
.generatePublic( publicKeySpec );
var verifier = createObject( "java", "java.security.Signature" )
.getInstance( javaCast( "string", 'SHA256withRSA' ));
var verifier.initVerify( publicKey );
var verifier.update( charsetDecode( body, "utf-8" ) );
var signature = reReplace( signature, "-", "+", "all" );
var signature = reReplace( signature, "_", "/", "all" );
var verified = verifier.verify( charsetDecode(signature, "utf-8"));
return verified;
}
Этот код выполняется и не содержит ошибок, но он всегда возвращает false, даже если я знаю, что подпись действительна.