2012-03-06 23 views
4

私はクライアントのLinkedInライブラリで作業していますが、パズルの認証部分を通過する際に問題があります。私はRIAForgeでOAuthライブラリを使用し、CF9とMXUnitテストでスクリプトベースのCFCを利用するためにすべてを書き直しました。 HMAC-SHA1アルゴリズムを使用してOAuth署名を作成しようとすると、LinkedInが探しているものと一致するように見えることはありません。LinkedIn APIでのOAuth認証の問題

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

問題、私は信じて、暗号化用の秘密鍵である:彼は私が持っている要求に署名する私の方法です。私は基本的な文字列をLinkedInのOAuthテストツールhttp://developer.linkedinlabs.com/oauth-test/から比較しています。それは完全に一致しているので、それを暗号化するために使用されたキーが問題になっています。私はまだOAuthトークンの秘密を持っていないので、私の秘密はfdsa43fdsa3j&に似ています。それが何であるべきか、あるいは最後にアンパサンドがエンコードされた形式でなければならないのでしょうか?

Twilioに接続するためのOAuthを使用するための正しいメソッド

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

Ben Nadel has an example。あなたの署名コードと彼の主な違いは、彼がSecretKeySpecを設定するときにいくつかのエンコーディングを使うことです。ここで

は彼のポストから関連スニップです:

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

おかげパット私はベンNadelのページに移動するとき、私の写真が来たので、私はこれが私の答えを保持しようとしていることを伝えることができます;) –

+0

感謝助けを求めてそれは必ずしも100%の正解ではありませんでしたが、それは私を正しい方向に動かしました。上記の正しい方法を投稿したので、うまくいけば他の人を助けるでしょう。 –

+0

@DaveLong:質問を変更するのではなく、別の回答として投稿する必要があります。これは将来の読者のための道標として機能します。または、「受け入れる」クレジットを保持できるように、使用したソリューションと一致するPatrickの回答を編集します。 – ale