2012-03-13 12 views
2

LinkedIn APIと統合されたクライアント用のアプリケーションを作成しています。私はあまりにも多くの問題なしで認証を取得しましたが、すべてが機能しており、今は実際の要求をする必要があります。主に私はShare APIで作業しています。私は、ヘッダパラメータ(通常のOAuthのparamsで署名しようとしているLinkedIn APIに対するリクエストをOAuthすると401エラーが発生する

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); 
    } 

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(); 
    } 

Iは要求に署名する場合、私は、次の方法を使用します。私は、以下の方法を使用してHTTPコールを作成します)、bodyパラメーター(xml文字列)が含まれていますが、すべてが私に401エラーを出すので、要求のために署名されたベース文字列で何を使用すべきか疑問に思っていましたか?

答えて

0

質問に対する適切な回答ではありませんが、お手伝いがあります。

私のケースでは、CF8でLinkedIn APIを使用する試みがうまくいかなかった後、最終的にそれを諦めました/それ以上の時間はありませんでした。 「適切な」統合の代わりに、linkedin-j Javaライブラリを使用しました。ついにそれが私に行きました、そして、私はもう署名の問題に遭遇しませんでした。

OAuthを必要とする私のすべての統合のためのBtw私はthisライブラリを使用しましたが、LinkedIn APIのように署名の問題はありませんでした。

+0

ルーカス、私はAPIコネクタを実装するためにlinkedin-jを使い始めましたが、OAuthの実装を終えてAPIメソッドに移っても、私はこのエラーを受けていました: ' javax.xml.bind.JAXBException:com。 google.code.linkedinapi.schemaはObjectFactory.classまたはjaxb.in​​dexを含んでいません。私はあなたがそれに対処しているかどうか、あなたはそれをどのように受け継がれているのだろうかと思っていました –

+0

http://code.google.com/p/linkedin-j/downloads/listから入手したジップはどれですか? linkedin-j-1.0.415-binary.zipまたは1.0.429のベータ版バイナリを入手する必要があります。 *そこからJARをすべて取得し、サーバー上に置くべき場所に置いてください(セットアップに依存します、通常は#server.ColdFusion.ROOTDIR#\ lib \にあります)。次に、CFを再起動する必要があります。投稿したエラーから、JARの1つが見つからないようです。 – Lucas

+0

私は実際にJavaLoaderを使用しており、JAXBが正しく動作するための特別な機能を組み込むためにlinkedin-j JARを再コンパイルする必要がありました。問題ページのIssue#53にありました。 –

関連する問題