2012-03-06 56 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測試工具進行了比較,它的匹配度很好,因此用於加密的密鑰必定是我的問題。我還沒有OAuth令牌,因此我的祕密與fdsa43fdsa3j&類似。那應該是什麼,或者最後的&符號是以編碼格式還是別的?

正確的方法

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爲使用OAuth連接到Twilio。您的簽名代碼和他的主要區別在於,他在設置SecretKeySpec時使用了一些編碼。

這是從他的崗位的相關剪斷:

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

感謝帕特,我可以告訴大家,這是要保持我的答案,因爲當我去奔納德爾的頁面,我的圖片上來;) – 2012-03-06 18:27:40

+0

謝謝尋求幫助。這不一定是100%正確的答案,但它使我朝着正確的方向前進。我已經發布了上面的正確方法,以便它可以幫助其他人。 – 2012-03-06 19:12:09

+0

@DaveLong:您應該將其作爲單獨的答案發布,並接受它而不是修改您的問題。這將成爲未來讀者的路標。或者,編輯Patrick的答案以匹配您使用的解決方案,以便他可以保留「接受」信用。 – ale 2012-03-13 18:20:03