2017-05-28 14 views
0

私はRESTfulなAPIサービスを作成しようとしました。私は、成功したログイン時にログインスクリプトによってJSONオブジェクトの一部としてクライアント側に返される文字列を(データベースに格納されたランダムに生成された秘密鍵を使用して)ハッシングしてトークンを生成しました。クライアントは、他のAPIサービスへのアクセスを得るために、GET/POSTパラメータとしてトークン(JSONオブジェクトとしての他のフィールドとともに)を渡します。しかし、トークン文字列がJSONオブジェクトとして渡されると、その文字列が途中で変更され、検証エンドポイントで秘密鍵でデハッシュしても、ハッシュされた文字列と同じ文字列が生成されないようです。結果は、トークンによって保護されたデータを取得することに失敗しました。ハッシュされたトークンをGETパラメータとして送信する

私は、関連するコードの一部追加してい:

ログインスクリプト

$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のカールポストフィールドとして

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

を認証するためにhttp://www.ckoysolutions.com/apis/authuser.phpで使用検証

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

機能ここで間違っているかもしれないものをお勧めください。

+1

JWT(JSON Webトークン)と同じ概念です。このhttps://github.com/firebase/php-jwtにはたくさんのlibrairiesがあります。おそらくそれらを – Treast

+0

@Treastで見てください。実際にJWTからアイデアを得て、同様のことをすることにしました。それは本当に安全と思われました。そして、私はこれを見ていただき、ありがとうございます:D –

答えて

1

これと同様の問題がありました。トークンがクエリ文字列パラメータとして渡され、+文字が含まれていると、トークンが削除されます。この呼びかけが常に破られたわけではないので、私はこの問題を発見しました。私の最も簡単な解決策は、 "+"を "P"に置き換えることでした。 AJAX POST and Plus Sign (+) — How to Encode?

+0

実際には、js部分にはencodeURI()とdecodeURI()を使用し、PHP部分にはencodeurl()とdecodeurl()を使用しました。 「+」が再び現れた場合、それが壊れるかどうかはわかりませんが。途中でありがとう。 :) –

+0

私はPHPではなく.Netで問題に遭遇しました。エンコードとデコードにもかかわらず、私はまだ問題を抱えていましたが、それがあなたのために働いていれば、それは確かにきれいなアプローチです。 –

+0

トークンがすでにエンコードされているかどうかにかかわらず、jqueryからトークンを渡すたびに、urlencode()を追加する必要があります。 –

関連する問題