CodeIgniter + Tank Auth を使用しています。コードhttp://localhost/XXXXXXXX/auth/forgot_password のみが機能しません。結果は常に次のとおりです。
登録とアクティベーションは問題ありません。
CodeIgniter + Tank Auth を使用しています。コードhttp://localhost/XXXXXXXX/auth/forgot_password のみが機能しません。結果は常に次のとおりです。
登録とアクティベーションは問題ありません。
考えられる問題:
$config['forgot_password_expire']
し、Tank Auth をチェックしてください。メール内の間違った URL にリンクしている可能性があります。これは正しくありません:
http://localhost/XXXXXXXX/auth/forgot_password
次のようになります。
http://localhost/auth/forgot_password/XXXXXXXX
Tank Auth の使用を思いとどまらせるわけではありませんが、使用した後、まだ初期段階にある場合は、Ion_Authを試すことをお勧めします。PyroCMSでも同様に使用されていると思います。
URL の XXXXXXXX が /auth/ の前に余分な URI セグメントがあることを示している場合は、これを変更する必要があります。
function reset_password()
{
$user_id = $this->uri->segment(3);
$new_pass_key = $this->uri->segment(4);
これに:
function reset_password()
{
$user_id = $this->uri->segment(4);
$new_pass_key = $this->uri->segment(5);
$this->uri->segment() の異なる数値に注意してください。/auth/ の前に追加のセグメントがあると、ユーザー ID とアクティベーション コードは、(Tank Auth が想定する 3 番目と 4 番目ではなく) 4 番目と 5 番目のセグメントでパラメーターとして渡されます。
ユーザーモデル関数「can_reset_password」のデータベースのタイムスタンプである可能性があります UNIX_TIMESTAMP(new_password_requested) を使用します
$user_id と $new_pass_key が正しい場合は echo できますが、問題は時間の比較にあります。URL を修正して、常に最後の 2 つのセグメントを取得する
$break =$this->uri->total_segments();
$new_pass_key= $this->uri->segment($break);
$user_id= $this->uri->segment($break-1);
タイムスタンプについては、ユーザーモデルの関数 reset_password でこれを試してください
function reset_password($user_id, $new_pass, $new_pass_key, $expire_period = 900)
{
$this->load->helper('date');
$this->db->set('password', $new_pass);
$this->db->set('new_password_key', NULL);
$this->db->set('new_password_requested', NULL);
$this->db->where('id', $user_id);
$this->db->where('new_password_key', $new_pass_key);
$this->db->where('UNIX_TIMESTAMP(new_password_requested) >=',mysql_to_unix( time() - $expire_period));
$this->db->update($this->table_name);
return $this->db->affected_rows() > 0;
}
メインの index.php では、タイム ゾーンを定義する必要があります。例:
date_default_timezone_set('Europe/Paris');
これにより、次のチェックですべての日付が同じタイムゾーンであることが保証されます
$this->db->where('UNIX_TIMESTAMP(new_password_requested) >', time() - $expire_period);