Я работаю над созданием библиотеки для клиента для интеграции с API LinkedIn и в настоящее время работаю над реализацией OAuth. Я могу запросить исходный токен без проблем и заставить пользователя предоставить аутентификацию моему приложению, но когда я пытаюсь запросить токен доступа с помощью oauth_token и oauth_verifier (вместе с остальной информацией oauth, которую я отправляю при каждом запросе Я получаю подпись неверной ошибки.
Параметры OAuth, которые я отправляю, следующие:
- oauth_consumer_key
- oauth_nonce
- oauth_timestamp
- oauth_signature_method
- oauth_version
- oauth_token
- oauth_verifier
Я также добавляю в подпись oauth_signature, которая является подписанной версией всех этих ключей. Я подписываю запрос следующим способом:
public void function signRequest(any req){
var params = Arguments.req.getAllParameters();
var secret = "#Variables.encoder.parameterEncodedFormat(getConsumer().getConsumerSecret())#&#Variables.encoder.parameterEncodedFormat(Arguments.req.getOAuthSecret())#";
var base = '';
params = Variables.encoder.encodedParameter(params, true, true);
secret = toBinary(toBase64(secret));
local.mac = createObject('java', 'javax.crypto.Mac').getInstance('HmacSHA1');
local.key = createObject('java', 'javax.crypto.spec.SecretKeySpec').init(secret, local.mac.getAlgorithm());
base = "#Arguments.req.getMethod()#&";
base = base & Variables.encoder.parameterEncodedFormat(Arguments.req.getRequestUrl());
base = "#base#&#Variables.encoder.parameterEncodedFormat(params)#";
local.mac.init(local.key);
local.mac.update(JavaCast('string', base).getBytes());
Arguments.req.addParameter('oauth_signature', toString(toBase64(mac.doFinal())), true);
}
Я знаю, что это работает, потому что я могу использовать тот же метод для запроса начального токена (без параметров oauth_token или oauth_verifier), поэтому я предполагаю, что это проблема с параметрами, которые я подписываю. (И да, я упорядочиваю параметры в алфавитном порядке, прежде чем подписать их)
Так есть ли параметр, который я не должен включать в подпись, или другой, которым я должен быть?
Это пример базовой строки, которая шифруется:
POST&https%3A%2F%2Fwww.linkedin.com%2Fuas%2Foauth%2FaccessToken&oauth_consumer_key%3Dwfs3ema3hi9s%26oauth_nonce%3D1887241367210%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1331326503%26oauth_token%3D8b83142a-d5a6-452e-80ef-6e75b1b0ce18%26oauth_verifier%3D94828%26oauth_version%3D1.0