数時間後、答えが他の誰かにとって明らかであっても、この質問を投稿する必要があります。
問題は、トークンをテストしたいということですが、これをハードコーディングしても、まだ INVALID になります。PHPADMINで直接テストしたので、それが正しいに違いないことはわかっています。奇妙なのは、最初は (ハードコードされずに) 常にパスするが、その後は役に立たないことです。トークンは Cookie から取得されます。
public function findTriplet($credential, $token, $persistentToken) {
$token = "459078a3b05ce938ed58f9678ac78f1agcgfsewe4";
$persistentToken = "24d317b742da89ddf5b8ed50993d0f3cgcgfsewe4";
$credential ="34";
$q = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
"FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
"AND {$this->persistentTokenColumn} = SHA1(?) LIMIT 1 ";
$query = $this->db->prepare($q);
$query->execute(array($token, $credential, $persistentToken));
$result = $query->fetchColumn();
if (!$result) {
return self::TRIPLET_NOT_FOUND;
} else if ($result == 1) {
return self::TRIPLET_FOUND;
} else {
return self::TRIPLET_INVALID; }
}
編集
limit 句は常に最初に見つかった行をキャッチするため、常に不一致が発生します。これを修正する必要があります。
解決策は簡単でした。新しく生成されたトークンを使用して新しい行を挿入する前に、検証されたばかりのエントリを削除します。新しい行には、検証したばかりの同じ persistenceToken が含まれている必要があります。覚えておいてください、これはまだ安全ではないので、サーバー側でこれが cookielogin であることを示す FLAG を設定し、重要なデータを処理するために REAL LOGIN を必要とします。