OAuth, делающий запросы к API LinkedIn, вызывает ошибку 401 - PullRequest
2 голосов
/ 13 марта 2012

Я создаю приложение для клиента, которое интегрируется с API-интерфейсом LinkedIn.Я прошел проверку подлинности без особых проблем, но там все работает, и теперь мне нужно делать реальные запросы.В основном я работаю в 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) и включают параметр body (строка xml), но все дает мне ошибку 401, поэтому мне было интересно, что мне следует использовать в моей базовой строке, которая подписывается для запроса?

1 Ответ

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

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

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

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

...