2011-02-26 92 views
0

我試圖建立一個有效的簽名密鑰(我使用的是HMAC-SHA1方式),至今這仍是無效的(我使用一個在線測試服務器在http://term.ie/oauth/example/client.php):PHP Oauth構建簽名密鑰?

function _build_signature_hmac($base_url, $params, $consumer_key, $token_secret = '') 
    { 
     // Setup base-signature data 
     $data = 'POST&' . $base_url . '&'; 

     // Sort the params array keys first 
     ksort($params); 

     // Attach params string 
     $data .= rawurlencode(http_build_query($params)); 

     // Build the signature key 
     $key = rawurlencode($consumer_key) . '&' . rawurlencode($token_secret); 

     return base64_encode(hash_hmac('sha1', $data, $key)); 
    } 

由於這是對未授權令牌的請求,因此$ token_secret字符串爲空。 返回的簽名是這樣的:

POST&http://term.ie/oauth/example/request_token.php&oauth_consumer_key%3Dkey%26oauth_nonce%3D0uPOn3pPUbPlzWx2cO6citRPafIni5%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1298745681%26oauth_version%3D1.0 

而且$關鍵是這樣的:secret&

的關鍵/機密是正確的,我從服務器獲取一個響應說「無效的簽名」 。我是以正確的方式建設嗎?

+0

我建議邏輯分隔條件首先在它自己的步驟來創建簽名基本字符串,所以你可以使用一些測試頁面,比如http://developer.netflix.com/resources/OAuthTest在你進入簽名創建之前驗證你的基本字符串是否正確。 –

+0

感謝您的鏈接。 NetFlix Oauth服務器也報告無效簽名,所以我認爲可以肯定地認爲我的簽名有問題。 –

回答

1

從我使用的實現方法....

public function build_signature($request, $consumer, $token) { 
    $base_string = $request->get_signature_base_string(); 
    $request->base_string = $base_string; 

    $key_parts = array(
     $consumer->secret, 
     ($token) ? $token->secret : "" 
    ); 

    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); 
    $key = implode('&', $key_parts); 

    return base64_encode(hash_hmac('sha1', $base_string, $key, true)); 
    } 



public static function urlencode_rfc3986($input) { 
    if (is_array($input)) { 
    return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input); 
    } else if (is_scalar($input)) { 
    return str_replace(
     '+', 
     ' ', 
     str_replace('%7E', '~', rawurlencode($input)) 
    ); 
    } else { 
    return ''; 
    } 

如果它有助於在所有...

+0

感謝您的代碼片段。不管我使用哪一個,因爲$ key只包含'secret',所以它不是一個RFC3986編碼問題。也許這只是服務器搞亂了我。 –