2012-03-13 122 views
2

我正在爲與LinkedIn API集成的客戶端創建應用程序。我通過了身份驗證,沒有太多問題,但所有工作都正常,現在我需要提出實際的請求。主要是我在Share API中工作。我創建具有以下方法HTTP調用:OAuth對LinkedIn API的請求導致401錯誤

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 PARAMS )幷包含body參數(xml字符串),但是所有事情都會給我一個401錯誤,所以我想知道在應用程序的基礎字符串中應該使用什麼?

回答

0

不是你的問題的正確答案,但可以幫助你。

在我的情況下,經過很多不成功的使用LinkedIn API與CF8的嘗試後,我終於放棄了/沒有更多的時間。我已經使用了linkedin-j Java庫,而不是「正確的」集成。它終於讓我走了,我沒有遇到任何更多的簽名問題。

順便說一句,我所有的需要OAuth的集成我已經使用this庫,並沒有任何簽名問題,如LinkedIn API。

+0

Lucas,我​​開始使用linkedin-j來實現我的API連接器,但是一旦我完成OAuth實現並轉移到API方法中,我就不斷收到此錯誤:' javax.xml.bind.JAXBException:「com。 google.code.linkedinapi.schema「不包含ObjectFactory.class或jaxb.in​​dex'。我想知道你是否處理了它,以及你是如何通過它的? – 2012-04-09 02:36:23

+0

你從這裏http://code.google.com/p/linkedin-j/downloads/list得到了哪個zip?應該獲得linkedin-j-1.0.415-binary.zip或1.0.429測試版二進制文件。從那裏獲取所有JAR,並將它們放在服務器上的位置(取決於安裝方式,通常在#server.ColdFusion.ROOTDIR#\ lib \中)。然後你需要重新啓動CF.從你發佈的錯誤看來,其中一個JAR缺失。 – Lucas 2012-04-10 09:45:32

+0

我實際上使用JavaLoader,並且必須重新編譯linkedin-j JAR以包含一些特殊的事情,以便JAXB正常工作。它在問題頁面的問題#53中。 – 2012-04-10 15:44:21

相關問題