Проблема с запросом OAuth Access Token - PullRequest
2 голосов
/ 10 марта 2012

Я работаю над созданием библиотеки для клиента для интеграции с 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

Ответы [ 2 ]

1 голос
/ 12 марта 2012

При отправке запроса POST вам необходимо поместить информацию об аутентификации в заголовок, а не в параметры запроса.

Информацию см. На этой странице (см. «Отправка заголовка авторизации»): https://developer.linkedin.com/documents/common-issues-oauth-authentication

Я подозреваю, что это проблема, с которой вы столкнулись.

0 голосов
/ 13 марта 2012

Хорошо, это был глупый ответ, но проблема заключалась в том, что я не увидел, как oauth_token_secret пришел, когда пользователь разрешил доступ к моему приложению, поэтому я все еще пытался подписать запрос, используя только секретный ключ пользователя не как секрет потребителя, так и секрет токена.

...