2016-12-31 124 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

经过长时间的测试和尝试,重新开始和沮丧之后,我才弄清楚了这一点。在我的签名中发现,在生成之前,我没有按字母顺序列出参数,因此签名是不匹配的。

因此,关键在于,在生成签名时,请确保您的参数按字母顺序排列!