2016-12-31 122 views
0

我試圖從Apple的DEP系統爲我正在使用PHP的MDM服務器獲取auth_session_token。我是如此接近,但由於某種原因,不斷得到來自蘋果公司的服務器如下回應:PHP oAuth簽名無效 - Apple DEP

signature_invalidUnauthorized 

我試圖從網上做的研究和嘗試不同的方法,人們已經使用OAuth的方面不同的東西極多。但遺憾的是,蘋果的DEP服務器oAuth並沒有具體的具體內容。

很多人推薦使用oAuth類,但沒有一個支持Apple的系統。所以它看起來都需要手動完成。

我已經採取了與我的PHP代碼使用cURL的方法,這似乎工作正常,減去我無法得到正確的簽名的事實。

這裏是我想創建簽名(我再次嘗試了不同的方法極多,所以這是我最近嘗試):

function rfc3986_encode($string) { 
    $result = rawurlencode($string); 
    $result = str_replace('%7E', '~', $result); 
    $result = str_replace('=', '%3D', $result); 
    $result = str_replace('+', '%2B', $result); 

    return $result; 
} 

$consumer = "CK_REDACTED"; 
$secret = "CS_REDACTED"; 
$secret2 = "AS_REDACTED"; 
$token = "AT_REDACTED"; 
$sign_method = "HMAC-SHA1"; 
$version = "1.0"; 
$url = "REDACTED"; 
$path = "REDACTED"; 

$timestamp = strtotime('now'); 
$mt = microtime(); 
$rand = mt_rand(); 
$nonce = md5($mt.$rand); 

$post = array(
    'oauth_consumer_key' => rfc3986_encode($consumer), 
    'oauth_token' => rfc3986_encode($token), 
    'oauth_signature_method' => rfc3986_encode($sign_method), 
    'oauth_timestamp' => rfc3986_encode($timestamp), 
    'oauth_nonce' => rfc3986_encode($nonce), 
    'oauth_version' => rfc3986_encode($version) 
); 

$signatureParameters = array(); 
foreach ($post as $parameter => $value) { 
    $signatureParameters[] = rfc3986_encode($parameter) . '=' . rfc3986_encode($value); 
} 

$signatureParameters = implode('&', $signatureParameters); 

$baseString = "GET" 
      ."&".rfc3986_encode($url) 
      ."&".rfc3986_encode($signatureParameters); 

$key = rfc3986_encode($consumer) ."&"; 

$signature = base64_encode(hash_hmac('sha1', $baseString, $key)); 
$RFC3986signature = rfc3986_encode($signature); 

所以$ RFC3986signature就是我提早結束在oauth_signature參數的官方請求中,但最終沒有被接受。

有誰知道如何解決這個問題?當我在DEP Portal中添加我的服務器時,嘗試使用由&符號分隔的多個代碼/祕密,將它們翻轉過來等等,但我嘗試使用從Apple獲得的上述不同祕密和/或令牌進行簽名,但是依此類推......但同樣的事情...

回答

0

經過長時間的測試和嘗試,重新開始和沮喪之後,我才弄清楚了這一點。在我的簽名中發現,在生成之前,我沒有按字母順序列出參數,因此簽名是不匹配的。

因此,關鍵在於,在生成簽名時,請確保您的參數按字母順序排列!