“”状态“:” 401“,”代码“:” NOT_AUTHORIZED“,”标题“:”身份验证凭据丢失或无效。“

时间:2020-03-20 02:52:34

标签: php ios

我想请求Apple服务器,但我花了很多时间仍收到此消息“身份验证凭据丢失或无效”。 。 谁能找出脚本在哪里使用错误? 遵循以下脚本。

   require __DIR__ . '/vendor/autoload.php';
    use Firebase\JWT\JWT;
    date_default_timezone_set("Asia/Taipei");

    header('Content-Type: application/json'); // Specify the type of data

此版本的Apple api标头和有效载荷

   $privateKey =<<<EOD
    -----BEGIN PRIVATE KEY-----
    MY_privte_Key
    -----END PRIVATE KEY-----
    EOD;
    $JWT_Header = array(
        "kid"=> "xxxxx",
    );
    $JWT_Payload = array(
        "iss"=> "xx-xx-xx",
        "exp"=>time(),
        "aud"=> "appstoreconnect-v1"
    );

这将获得JWT令牌

   $jwt = JWT::encode($JWT_Header, $privateKey, 'ES256','YPVNQH3M54');
    $authorization = "Authorization: Bearer ".$jwt;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.appstoreconnect.apple.com/v1/users");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    //Set your auth headers
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
       'Content-Type: application/json',
       'Authorization: Bearer ' . $authorization
       ));

此api响应

  $response = curl_exec($ch);

      echo "<pre>";
    $err = curl_error($ch);

    curl_close($ch);


    if ($err) {

      echo "cURL Error #:" . $err."<br>";

       print_r(json_decode($response));

    } else {

      print_r(json_decode($response));

    }



function base64url_encode($data) {

    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');

  }

脚本执行结果时的图像 r

1 个答案:

答案 0 :(得分:1)

您似乎将exp声明设置为当前时间,这意味着您的令牌将立即失效。您应该将此设置为您希望令牌过期的时间。

由于您是在php页面中使用此令牌的,因此我假设它仅使用过一次。如果是这种情况,那么从现在开始30秒可能是安全的。足够长以解决时钟偏斜,但仍然很短以降低风险。

请记住,App Store Connect将拒绝将来超过20分钟到期的任何令牌。