* 自動ログイン [#bbba536e]
- 以下のページを参照のこと。
以下のページを参照のこと。
- http://blog.ohgaki.net/index.php/yohgaki/2006/05/12/
if (authenticate($username, $password) && !empty($_POST['auto_login'])) {
setup_auto_login();
}
if (empty($_POST['auto_login'])) {
// 自動ログイン用のクッキーを削除
delete_cookie('auto_login');
// 古い自動ログインkeyを削除
$sql = "delete from auto_login where key = '". sql_escape($_COOKIE['auto_login']). "';";
sql_qeury($sql);
}
function setup_auto_login() {
// 認証が完了し、自動ログインを設定
$auto_login_key = sha1(uniqid().mt_rand(1,999999999)); // keyを生成
$sql = "insert into auto_login (user_id, key, expire) values (" .
"'". sql_escape($_SESSION['user_id']). "', '". esq_escape($auto_login_key)."', '".
date('Y-m-d H:i:s', time()+3600*24*7) ."';";
sql_query($sql);
send_cookie('auto_login', $key, 3600*24*7); //有効期限7日の自動ログインクッキーを送信
}
ポイントとして、
- クッキーにはランダムな文字列のみ保存する。
- 手動ログイン成功時にランダムな文字列を生成し、サーバ側のDBとクライアント側のクッキーに同じものを保存する。
- ユーザが自動ログインを試みた場合、クッキーの文字列とDBの文字列を比較し、一致すればログイン成功、一致しなければログイン失敗となる。
- 自動ログイン(のチェックボックス)を外して手動ログインした時、もしくは手動ログアウト時は、サーバの文字列、クッキーの文字列を削除する。
- サーバのDBには文字列と一緒に日付を入れておき、適当なタイミングでExpireする。
とのこと。
if (!is_authenticated() && !empty($_COOKIE['auto_login'])) {
$sql = "select * from auto_login where key = '". sql_escape($_COOKIE['auto_login'])
."' and expire > '". date('Y:m:d H:i:s'). "';";
$records = sql_select_and_fetch_all($sql);
if ($records[0]['key'] === $_COOKIE['auto_login']) {
// 認証OK。認証処理を行う
// ......
// 古い自動ログインkeyを削除
$sql = "delete from auto_login where key = '". sql_escape($_COOKIE['auto_login']). "';";
sql_qeury($sql);
// 新しい自動ログインkeyを設定
setup_auto_login();
}
}
ただし、ユーザ名はクッキーにそのまま入れておいてもいいような気がするが?
if (!is_authenticated()) {
// 通常のログイン処理
}
if (!empty($_COOKIE['auto_login'])) {
// 自動ログイン用のクッキーを削除
delete_cookie('auto_login');
// 自動ログインkeyを削除
$sql = "delete from auto_login where key = '". sql_escape($_COOKIE['auto_login']). "';";
sql_qeury($sql);
}
//通常のログアウト処理