Запросы OAuth к LinkedIn API вызывают ошибку 401

Я создаю приложение для клиента, которое интегрируется с LinkedIn API. Я прошел аутентификацию без особых проблем, но там все работает, и теперь мне нужно сделать настоящие запросы. В основном я работаю в Share API. Я создаю HTTP-вызов следующим методом:

  public any function sendRequest(any req){
    var param = false;
    var headParams = [];
    var bodyParams = [];
    var call = new http(proxyserver='192.168.201.12', proxyport=8888);
    var i = 1;

    call.setUrl(Arguments.req.getRequestUrl());
    call.setMethod(Arguments.req.getMethod());

    getSigner().signRequest(Arguments.req);

    headParams = Arguments.req.getParameters(true);
    bodyParams = Arguments.req.getParameters();

    if(arrayLen(bodyParams)){
      call.addParam(
        type='header',
        name='Authorization',
        value="OAuth#Variables.encoder.encodedParameter(Arguments.req.getParameters(true), true, false, true)#"
      );
    }

    // Header parameters
    if(!arrayLen(bodyParams)){
      for(i=1; i<=arrayLen(headParams); i++){
        param = headParams[i];
        call.addParam(
          type=Arguments.req.getParameterType(),
          name=Variables.encoder.parameterEncodedFormat(param.name),
          value=param.value
        );
      }
    }

    // Body parameters (should only be 1)
    if(arrayLen(bodyParams)){
      for(i=1; i<=arrayLen(bodyParams); i++){
        param = bodyParams[i];
        call.addParam(
          type='xml',
          value=param.value
        );
      }
    }
    return call.send().getPrefix();
  }

Когда я подписываю запрос, я использую следующий метод:

  public void function signRequest(any req){
    var headParams = Arguments.req.getParameters(true);
    var bodyParams = Arguments.req.getParameters();
    var secret = "#Variables.encoder.parameterEncodedFormat(getConsumer().getConsumerSecret())#&#Variables.encoder.parameterEncodedFormat(Arguments.req.getOAuthSecret())#";
    var base = '';

    params = Variables.encoder.encodedParameter(headParams, true, true);
    params = "#params#&#Variables.encoder.parameterEncodedFormat(bodyParams[1].value)#";

    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)#";
    //writeDump(base) abort;
    local.mac.init(local.key);
    local.mac.update(JavaCast('string', base).getBytes());

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

Я попытался подписать его только с параметрами заголовка (обычные параметры OAuth) и включить параметр тела (строка xml), но все дает мне ошибку 401, поэтому мне было интересно, что я должен использовать в моей базовой строке, которая подписывается для запрос?


person Dave Long    schedule 13.03.2012    source источник


Ответы (1)


Не правильный ответ на ваш вопрос, но может помочь вам.

В моем случае после многих безуспешных попыток использования LinkedIn API с CF8 я, наконец, сдался / у меня не было на это больше времени. Вместо "правильной" интеграции я использовал linkedin-j библиотеку Java. Это, наконец, заставило меня начать работу, и я больше не сталкивался с проблемами подписи.

Кстати, для всех моих интеграций, требующих OAuth, я использовал эту библиотеку, и у меня не было проблем с подписью, как с LinkedIn. API.

person Lucas    schedule 14.03.2012
comment
Лукас, я начал использовать linkedin-j для реализации своего соединителя API, но как только я закончил реализацию OAuth и перешел к методам API, я продолжал получать эту ошибку: ` javax.xml.bind.JAXBException: com.google.code.linkedinapi .schema не содержит ObjectFactory.class или jaxb.index`. Мне интересно, справились ли вы с этим, и как вы это прошли? - person Dave Long; 09.04.2012
comment
Какой почтовый индекс вы получили отсюда code.google.com/p/linkedin-j /загрузки/список ? Должен получить linkedin-j-1.0.415-binary.zip или бинарники бета-версии 1.0.429. Получите оттуда все JAR-файлы и поместите их туда, где они должны быть на вашем сервере (зависит от настроек, обычно в #server.ColdFusion.ROOTDIR#\lib). Затем необходимо перезапустить CF. Судя по опубликованной вами ошибке, один из JAR-файлов отсутствует. - person Lucas; 10.04.2012
comment
На самом деле я использую JavaLoader, и мне пришлось перекомпилировать JAR-файл linkedin-j, чтобы включить некоторые специальные вещи для правильной работы JAXB. Это было в выпуске № 53 на странице выпусков. - person Dave Long; 10.04.2012