php
  • rest
  • oauth
  • 2016-07-19 97 views 1 likes 
    1

    我目前正試圖生成一個簽名以在線對quickbooks進行API調用,但是我不斷收到身份驗證錯誤。我確定簽名部分是我出錯的地方。這是不正確的:如何爲OAuth生成簽名

    //method to generate signature 
    //$this->method = "GET" 
    //QBO_SANDBOX_URL = 'https://some_url.com/' 
    //$this->_query = 'something=something' 
    
        public function generate_signature() 
    { 
    
        $base = $this->_method.'&'.rawurlencode($this->_url.QBO_SANDBOX_URL.'v3/company/'.$this->_realm_id).'&' 
         .rawurlencode("oauth_consumer_key=".rawurlencode($this->_consumer_key).'&' 
         .'&oauth_nonce='.rawurlencode('34604g54654y456546') 
         .'&oauth_signature_method='.rawurlencode('HMAC-SHA1') 
         .'&oauth_timestamp='.rawurlencode(time()) 
         .'&oauth_token='.rawurlencode($this->_auth_token) 
         .'&oauth_version='.rawurlencode('1.0') 
         .'&'.rawurlencode($this->_query)); 
    
        $key = rawurlencode($this->_consumer_secret.'&'.$this->_token_secret); 
    
        $this->_signature = base64_encode(hash_hmac("sha1", $base, $key, true)); 
    
    } 
    

    現在,當我去送了我的要求,這裏有頭:

    $this->_headers = array(
         'Authorization: '.urlencode('OAuth oauth_token="'.$this->_auth_token.'",oauth_nonce="ea9ec8429b68d6b77cd5600adbbb0456",oauth_consumer_key="'.$this->_consumer_key.'",oauth_signature_method="HMAC-SHA1", oauth_timestamp="'.time().'", oauth_version ="1.0"oauth_signature="'.$this->_signature.'"').'' 
    
        ); 
    

    ,我收到了401授權響應。我是否簽名不正確?

    編輯:這裏沒有包括所有字段(即$this->_auth_token)。

    +0

    我試圖做到這一點同樣的事情,我正在嘗試使用此代碼,你如何獲得App Token Secret?根據[文檔](https://developer.intuit.com/docs/0100_quickbooks_online/0100_essentials/000500_authentication_and_authorization/connect_from_within_your_app),我需要簽名才能檢索App Token Secret,但是您正在使用它來生成簽名'$ this - > _ token_secret',有什麼幫助? –

    +0

    @Josh Whitlow:您的應用程序令牌應由任何您想要驗證的服務提供給您。通常在儀表板的某處。順便說一下,上面的代碼工作,問題是雙'&'結束了$ base變量聲明的第二行。 – Kisaragi

    回答

    0

    這個問題是在基礎線:

    .rawurlencode("oauth_consumer_key=".rawurlencode($this->_consumer_key).'&' 
        .'&oauth_nonce='.rawurlencode('34604g54654y456546') 
    

    &消費者鍵後,並再次oauth_nonce之前。

    1

    對於任何人都可以使用此作爲他們自己的集成的基礎,還有另外一個問題的代碼最初發布:

    $key = rawurlencode($this->_consumer_secret.'&'.$this->_token_secret); 
    

    應該

    $key = rawurlencode($this->_consumer_secret).'&'.rawurlencode($this->_token_secret); 
    
    +0

    解決這個問題可能會更好。 – Whitecat

    +0

    @Whitecat也是這樣做的 - 沒有密鑰是正確的,生成的簽名永遠不會是正確的。 –

    相關問題