Проблемы с OAuth-аутентификацией в LinkedIn API - PullRequest
4 голосов
/ 06 марта 2012

Я работаю над библиотекой LinkedIn для моего клиента, и у меня возникли некоторые проблемы с получением части разрешения головоломки.Я использовал библиотеку OAuth в RIAForge и переписал все, чтобы использовать основанные на сценариях CFC в тестировании CF9 и MXUnit.Когда я пытаюсь создать сигнатуру OAuth с помощью алгоритма HMAC-SHA1, я никогда не могу соответствовать тому, что ищет LinkedIn.Он - мой способ подписать запрос, который у меня есть:

  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 = JavaCast('string', secret).getBytes();

    local.mac = createObject('java', 'javax.crypto.Mac').getInstance('HmacSHA1');
    local.key = createObject('java', 'javax.crypto.spec.SecretKeySpec').init(secret, local.mac.getAlgorithm());

    base = reReplaceNoCase(Arguments.req.getRequestUrl(), 'http[s]?://', '/');
    params = listSort(params, 'text', 'asc', '&');
    base = JavaCast('string', "#base#&#params#").getBytes();

    local.mac.init(local.key);
    local.mac.update(base);

    Arguments.req.addParameter('oauth_signature', toBase64(mac.doFinal()), true);
  }

Я считаю, что проблема в секретном ключе для шифрования.Я сравнил базовую строку с инструментом тестирования OAuth из LinkedIn, http://developer.linkedinlabs.com/oauth-test/,, и он отлично совпадает, поэтому ключ, используемый для его шифрования, должен решить проблему.У меня пока нет секрета токена OAuth, поэтому мой секрет похож на fdsa43fdsa3j&.Это то, что должно быть, или амперсанд в конце должен быть в закодированном формате, или что-то еще?

Правильный метод

  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());
    params = listSort(params, 'text', 'asc', '&');
    base = "#base#&#Variables.encoder.parameterEncodedFormat(params)#";

    local.mac.init(local.key);
    local.mac.update(JavaCast('string', base).getBytes());
    //writeDump(toString(toBase64(mac.doFinal()))); abort;
    Arguments.req.addParameter('oauth_signature', toString(toBase64(mac.doFinal())), true);
  }

1 Ответ

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

У Бена Наделя есть пример для использования OAuth для подключения к Twilio. Основное отличие вашего кода подписи от его заключается в том, что он использует некоторые кодировки при настройке SecretKeySpec.

Вот соответствующий отрывок из его поста:

<cfset secretKeySpec = createObject(
    "java",
    "javax.crypto.spec.SecretKeySpec"
  ).init(
    toBinary( toBase64( twilioAuthKey ) ),
    "HmacSHA1"
  )
/>
...