如何在接收方检查curl api密钥是否被授权

时间:2018-04-09 04:14:07

标签: php rest api curl

大家好我正在使用curl将数据从一个网站推送到其他网站它现在工作得很好但我想在接收方网址中添加一个令牌或apikey或密钥。如何在接收方端代码中写入。是否匹配令牌或apikey或密钥。但apikey或令牌不是来自数据库。 下面是我的代码

此代码为senderside:使用curl和参数apikey

    $payload = json_encode(array("users" => $json['users']));
     $post_json = json_encode($content);     
         $apikey = 'OTM2NTQ0MwMTA3MDYxMQNDAxOTU2MwMTA4MDQ1MgMzIzMDAyMA';    
           $endpoint = 'http://localhost/apib/data.php?apikey='.$api_key;
            $ch1 = @curl_init();
            @curl_setopt($ch1, CURLOPT_POST, true);
            @curl_setopt($ch1, CURLOPT_POSTFIELDS, $payload);
            @curl_setopt($ch1, CURLOPT_URL, $endpoint);
            @curl_setopt($ch1, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
            @curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
            $response = @curl_exec($ch1);
            $status_code = @curl_getinfo($ch1, CURLINFO_HTTP_CODE);
            $curl_errors = curl_error($ch1);
            @curl_close($ch1);
            /*echo "curl Errors: " . $curl_errors;
            echo "\nStatus code: " . $status_code;
            echo "\nResponse: " . $response;*/
            echo "\nResponse: " . $response;

在其他网站上的数据如下:我如何在这里为apikey编写代码

   \$jfile = file_get_contents('php://input');
    $final_res = json_decode($jfile, true) ;
    $dataaa =  $final_res['users'];
    $apikey;  
    global $db;
    $db = mysqli_connect("localhost", "root", "", "apis");
    if($db === false){
      die("ERROR: Could not connect. " . mysqli_connect_error());
    }

现在我想通过api key发送数据..我可以在接收方写一下是否正确

1 个答案:

答案 0 :(得分:1)

<强>更新

对于页面A,我们可以在发送之前将api密钥添加到json数组中。像这样:

$myData = array("users" => $json['users']);

$key = 'OTM2NTQ0MwMTA3MDYxMQNDAxOTU2MwMTA4MDQ1MgMzIzMDAyMA';

$api_key = array('apikey' => $key);

$myData = $myData + $api_key;

$payload = json_encode($myData);

$endpoint = 'http://localhost/apib/data.php';

$ch1 = @curl_init();
        @curl_setopt($ch1, CURLOPT_POST, true);
        @curl_setopt($ch1, CURLOPT_POSTFIELDS, $payload);
        @curl_setopt($ch1, CURLOPT_URL, $endpoint);
        @curl_setopt($ch1, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        @curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
        $response = @curl_exec($ch1);
        $status_code = @curl_getinfo($ch1, CURLINFO_HTTP_CODE);
        $curl_errors = curl_error($ch1);
        @curl_close($ch1);
        /*echo "curl Errors: " . $curl_errors;
        echo "\nStatus code: " . $status_code;
        echo "\nResponse: " . $response;*/
        echo "\nResponse: " . $response;

如果您只想比较第A页到第B页的键值,那么您可以为第B页执行类似的操作。

Page B:

    $api_key = 'OTM2NTQ0MwMTA3MDYxMQNDAxOTU2MwMTA4MDQ1MgMzIzMDAyMA';

    $jfile = file_get_contents('php://input');
    $final_res = json_decode($jfile, true);

    print_r($final_res);        

    $dataaa =  $final_res['users'];     


    if($api_key == $final_res['apikey']){        


      echo 'The api key matches.';

      global $db;
      $db = mysqli_connect("localhost", "root", "", "apis");
      if($db === false){
        die("ERROR: Could not connect. " . mysqli_connect_error());
      }

    } else { 

      echo 'The api key does not match.';
      exit();

    }

这是不好的做法,因为看起来好像你的api键是不变的。任何看到api密钥的人都可以随意使用它来做B页所做的任何事情。这里没有真正的保障。如果你的api密钥被用于其他任何重要的东西,你可以将它分享给全世界。

如果您执行我在评论中建议的内容,则可以在页面A和B之间共享api密钥,但是每次发送时,发布请求中附加到api密钥的实际值都会更改。但是你将能够解密它,它将永远是api密钥。如果没有,则出现问题。此外,如果您的密钥没有受到损害,您将能够保证您发送的任何其他数据也未被篡改。

我强烈建议您阅读以下链接:

https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly

要做你正在做的事情并不是那么困难,你只需要熟悉你选择的库和所需的方法。