私は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;
}
機能ここで間違っているかもしれないものをお勧めください。
JWT(JSON Webトークン)と同じ概念です。このhttps://github.com/firebase/php-jwtにはたくさんのlibrairiesがあります。おそらくそれらを – Treast
@Treastで見てください。実際にJWTからアイデアを得て、同様のことをすることにしました。それは本当に安全と思われました。そして、私はこれを見ていただき、ありがとうございます:D –