ワンタイムURL
一度あるいは、限られた時間あるいは回数しかGETリクエストを受け付けないメカニズムである。 目的は、アクセス制限されたリソースに対して未承認アクセスすることをより困難にすることにある。
何かのログインでパスワードを忘れた時にメールアドレスを入力してそのアドレス宛に再設定などを行うURLが送られてくるやつです。
基本的な流れ
① メールアドレスを入力してそのアドレス宛にメール送信
https://book.cakephp.org/2/ja/core-utility-libraries/email.html
App::uses('CakeEmail', 'Network/Email');
$content = array('url' => $url);
$email = new CakeEmail();
$email->from('example@test.com')
->to($post_email)
->template('text_email')//テンプレートファイル名指定
->viewVars($content)//text_email.ctp内の$url変数はコントローラ内のviewVarsメソッドで渡した値を利用
->subject('パスワード再設定')
->send();//メール送信
② 送信と同時にDBにランダムなトークンを保存する
$token = substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, 16);//ランダムな文字列
$save_data = array('User' => array('token' => $ctoken));//保存するワンタイムトークン
$this->User->save($save_data);//配列で値を渡す
③ ②と同時に有効期限を設定する
$limit = time() + 1800;//有効期限30分
メールを送信した時間から1800秒(30分)足した時間
④ 受け取ったURLのチェックを行う
$key = $this->request->query['key'];//パラメータからcheck_flagを取得
$pass = $this->request->data['User']['password'];//新しいパスワード
$save_data = array('User' => array('password' => $pass, 'token' => null));//保存するデータ
if (intval($expire) < time() || $key !== $db_token'User']['check_flag']) {
$this->Flash->error('このURLは無効です');
} else {
if ($this->request->is('post')) {
$this->User->save($save_data);
$this->Flash->success('パスワードを更新しました');
}
}
DBに保存されているトークンとURLのキーで受け取った値が一緒であるかチェックする
一致しない場合は無効なURLとなる
また、②で設定した時間が現在時間より大きい場合も無効なURLとなる。