将散列标记作为GET参数发送

时间:2017-05-28 05:28:46

标签: php json http curl token

我尝试过创建RESTful API服务。我通过在成功登录时将登录脚本返回的字符串(使用存储在数据库中的随机生成的密钥)散列到客户端作为JSON对象的一部分来生成令牌。客户端将令牌(以及其他一些字段作为JSON对象)作为GET / POST参数传递,以访问其他API服务。但是,似乎当令牌字符串作为JSON对象传递时,字符串在中间的某处被更改,并且在验证端点处使用密钥对其进行取消,并不会产生与经过哈希处理的字符串相同的字符串。结果是尝试获取令牌保护的数据失败。

我正在添加相关的部分代码:

登录脚本

$secret = newsecret($rand);
$token = newtoken($secret, $str);

$qry1 = "UPDATE user_master set user_secret='".$secret."' where user_code='".$uid."'";
$res1 = mysqli_query($conn, $qry1);

$outdata = array("status" => "success", "username" => $un, "uid" => $uid, "token" => $token);
header('Content-type: application/json');
echo json_encode($outdata);

客户端JS

$.post("http://www.ckoysolutions.com/apis/login.php", inputs).done(function(data){
    if(data.status=="success") {
        var inputs = '{ '
            +'"uid" : "'+data.uid+'" , '
            +'"token" : "'+data.token+'"'
        +' }';

        window.location='http://hasconpanel.ckoysolutions.com/hasconpanel.php?inputs='+inputs;
    }
    else {
        alert(data.message);
    }
});

重定向页面(http://hasconpanel.ckoysolutions.com/hasconpanel.php)将令牌作为json发送为curl postfield以进行验证

if(isset($inputs->uid) && isset($inputs->token)) {
    $token = $inputs->token;
    $uid = $inputs->uid;

    $auth_data = array("uid" => $uid, "token" => $token);
    $auth_json = json_encode($auth_data);
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $auth_json,
        CURLOPT_URL => "http://www.ckoysolutions.com/apis/authuser.php",
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json'
        ]
    ]);
    $result = curl_exec($curl);
    curl_close($curl);

    echo $result;
}

http://www.ckoysolutions.com/apis/authuser.php中用于验证的功能

$row = mysqli_fetch_array($res);
$secret = $row['user_secret'];
$token = $token;

$un = $row['user_name'];
$words = explode(" ",$un);
$fn = $words[0];
$udetails = $row['user_log'];
$udetails = json_decode($udetails);
$uip = $udetails->ip;
$date_time = $udetails->time;

$str = $date_time.$fn.$uip;
$chkstr = decrypt($secret, $token);

if($str == $chkstr) {
    $outdata = array("status" => "success");
    mysqli_close($conn);
}
else {
    $outdata = array("status" => "failure");
    mysqli_close($conn);
}
header('Content-type: application/json');
echo json_encode($outdata);

请在这里建议可能出现的问题。

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,发现如果令牌作为查询字符串参数传递并包含+字符,它将被删除。我发现了这个问题,因为电话并不总是打破。对我来说最简单的解决方案是将“+”替换为“P”。 AJAX POST and Plus Sign ( + ) — How to Encode?