6
4

More than 3 years have passed since last update.

cakephp ワンタイムURL作成をメール送信

Posted at

ワンタイム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となる。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4