よくあるアレを作ります。
テーブル準備
CakePHPで使うのでそれっぽい命名規則で作ります。statusはt:temporary, r:registered, f:frozenとか。
メンバーテーブル
CREATE TABLE `members` (
`id` int(11) unsigned NOT NULL auto_increment,
`mail_address` varchar(255) NOT NULL,
`password` varchar(64) NOT NULL,
`nickname` varchar(32) collate utf8_unicode_ci NOT NULL,
`status` enum('t', 'r', 'f') default 't',
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_unicode_ci;
keyを作る
大雑把な流れとして以下を考えました。
- membersにレコードをINSERT
- members.idからkeyを作成
- idとkeyを含んだメールを会員へ送信。
secret_hash_keyの部分は適当に変えつつ
$key = hash_hmac("sha256", $id, 'secret_hash_key');
とか
$key = hash_hmac("sha512", $id, 'secret_hash_key');
とかですかね。
keyを認証
- id: 123
- key: de461a3115008022010913e6d7f73dad113a40a057d49816a42678f897163185
とかだったら、
http://exampl.com/register/123/de461a3115008022010913e6d7f73dad113a40a057d49816a42678f897163185
みたいなアドレスをクリックさせて
$key = hash_hmac("sha256", $id, 'secret_hash_key');
の結果とパラメータのkeyを照合させて登録ですかね。その際に、members.createdから5分以内とか30以内とか、なんかそういう処理を入れつつmembers.status='r'にするみたいな感じにしてみようかと思います。
適当に考えたけど、とりあえずメモ書き。