#ruby #typescript #oauth #cryptography #oauth-1.0a
Вопрос:
Я пытаюсь реорганизовать устаревший клиент Ruby OAuth1.0 в TypeScript. (К сожалению, в данный момент я не могу обновить сервер до OAuth2.0). Параметры запроса подписываются с помощью RSA-SHA1
закрытого ключа RSA.
Это устаревший код Ruby:
@consumer = OAuth::Consumer.new(credentials[:consumer_key], credentials[:private_key], site: credentials[:base_uri], signature_method: 'RSA-SHA1')
token = OAuth::AccessToken.new(@consumer, credentials[:access_token], credentials[:access_token_secret])
Это код TS, использующий https://github.com/rzcoder/node-rsa:
Изменить: После просмотра спецификации я явно добавил тип ключа — pkcs1-private
.
const oauth = new OAuth({
consumer,
version: '1.0',
signature_method: 'RSA-SHA1',
hash_function: (baseString, key) => {
const nPrivateKey = new NodeRSA(privateKey, 'pkcs1-private');
return nPrivateKey.encrypt(baseString, 'base64');
},
})
Это проверочный код PHP-сервера:
$decodedSignature = base64_decode($request->urldecode($signature));
$certificate = $this->getPublicCertificate($request);
$publicKeyId = openssl_get_publickey($certificate);
$isValid = openssl_verify($baseString, $decodedSignature, $publicKeyId);
При отладке на сервере проверка OpenSSL с помощью открытого ключа не совпадает.
С возможными комбинациями кодирования, различными ключами и алгоритмами я не уверен, как это отладить/протестировать.
Есть какие-нибудь идеи?