2017-05-28 12 views
0

Ich habe versucht, einen RESTful-API-Dienst zu erstellen. Ich habe ein Token generiert, indem ich eine Zeichenfolge (mit einem zufällig generierten geheimen Schlüssel, der in der Datenbank gespeichert ist), der vom Login-Skript bei erfolgreicher Anmeldung zurückgegeben wird, zum Client-Ende als Teil eines JSON-Objekts hash. Der Client übergibt das Token (zusammen mit einigen anderen Feldern als JSON-Objekt) als GET/POST-Parameter, um Zugriff auf die anderen API-Services zu erhalten. Es scheint jedoch, dass wenn die Token-Zeichenfolge als JSON-Objekt übergeben wird, die Zeichenfolge irgendwo in der Mitte geändert wird, und die Enthashung mit dem geheimen Schlüssel am Überprüfungsendpunkt nicht die gleiche Zeichenfolge wie die Zeichenfolge, die gehashed wurde. Das Ergebnis ist ein erfolgloser Versuch, die Daten durch das Token zu sichern.Senden eines Hash-Tokens als GET-Parameter

Ich addiere Teile des Codes, die relevant sind:

Anmeldeskript

$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); 

Client-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); 
    } 
}); 

Weitergeleitet Seite (http://hasconpanel.ckoysolutions.com/hasconpanel.php) sendet Token als Json als Curl Postfield für Überprüfung

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; 
} 

Funktion in http://www.ckoysolutions.com/apis/authuser.php zur Authentifizierung

$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); 

Bitte legen nahe, was man hier falsch gehen.

+1

Was Sie tun, ist das gleiche Konzept wie JWT (JSON Web Token). Es gibt viele Librairies für diese https://github.com/firebase/php-jwt vielleicht sollten Sie sie anschauen – Treast

+0

@Treast .. Eigentlich habe ich die Idee von JWT, und beschloss, etwas ähnliches zu tun. Es schien sehr sicher zu sein. Und danke, ich schaue mir das an.: D –

Antwort

1

Ich hatte ein ähnliches Problem, und festgestellt, dass, wenn das Token als Abfragezeichenfolgenparameter übergeben wird und das Zeichen + enthält, wird es entfernt. Ich habe das Problem entdeckt, weil der Anruf nicht immer unterbrochen wurde. Die einfachste Lösung für mich war, "+" durch "P" zu ersetzen. AJAX POST and Plus Sign (+) — How to Encode?

+0

Eigentlich habe ich encodeURI() und decodeURI() für den js-Teil und encodeurl() und decodeurl() für den php-Teil verwendet, und ich bekomme jetzt einen erfolgreichen Login, obwohl ich nicht sicher bin, ob es bricht, wenn das "+" wieder erscheint. Danke dir übrigens. :) –

+0

Ich lief in das Problem mit .Net, nicht php. Ich hatte immer noch das Problem trotz Kodierung und Entschlüsselung, aber wenn es für dich funktioniert, ist das sicherlich der sauberere Ansatz. –

+0

Ich habe es funktioniert, obwohl es ein bisschen chaotisch ist, anscheinend, ich muss urlencode() hinzufügen jedes Mal, wenn ich das Token von jquery übergeben, unabhängig davon, ob das Token bereits codiert ist oder nicht. –

Verwandte Themen