ログイン機能カスタマイズ、複数回エラー時の対応
今回は、ログイン機能をカスタマイズする際のログインエラー処理について備忘録もかねて記載します。何も考えないで実装すると、ログインエラーを繰り返すと、?login=failedがたくさんくっついてしまう事象が発生してしまいます。
今回は、本内容の解決手段について段階的に記載します。
1.ログイン失敗時のリダイレクト先の生成
各ページでログイン用のモーダルウィンドウなどを設置しログイン機能を各ページからログインできるように実装するような場合、現在の開いているページのURLを取得し、ログインフォームのURLやログイン失敗時のリダイレクト先を作成する場合があります。
1.現在のページからログインフォームのURLを作成する場合
1 2 | $http = is_ssl() ? "https" : "http" . "://"; $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; |
2.ログイン失敗時のリダイレクト先を以下で作成
1 | $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '?login=failed'; |
※なお、Wordpressにも、現在開いているページのURLを取得する関数(get_the_permalink)がありますが、この関数ですと、GETオプションがついていると取得ができないため、今回は利用することができません。
is_ssl()は、SSLかどうかを確認し、SSLの時には”https:”を、そうでない場合”http:”を付加しています。
$_SERVER[‘HTTP_HOST’]は、現在のリクエストのホスト、ヘッダーがあればその内容が入ってきます(rishuntrading.co.jpなど)。
$_SERVER[‘REQUEST_URI’]は、ページにアクセスする際に指定されたURI(ドメイン以下のパス)が入っています(/webdesign/など)。なお、GETオプションが付いているとその内容も入ってきます。
取得した情報から、1.ではログインフォームのURLを、2.では”?login=failed”を付加しログインエラーを通知するURLを生成しています。
ただし、これだと$_SERVER[‘REQUEST_URI’]にGETオプションも入ってきてしまうため、以下の問題があります。
(1)ログインを何回も間違えると、そのたびに”?login=failed”が付与されてしまう。(https://rishuntrading.co.jp/?login=failed?login=failed…など。)
(2)失敗した後に、ログイン成功した時のURLに、?login=failedがくっついたままとなってしまう。
2.URLからGETオプションを取り除く
parse_urlに、PHP_URL_PATHオプションを指定すると、GETオプションは取り除き、URLだけ返却してくれます。
1.現在のページからログインフォームのURLを作成する場合(改良版)
1 2 3 | $http = is_ssl() ? "https" : "http" . "://"; $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $redirect_url = parse_url($redirect_url, PHP_URL_PATH); |
最後に、parse_urlを実行する事で、GETオプションを取り除き、URLパスのみにしています。
2.ログイン失敗時のリダイレクト先も以下で作成(改良版)
1 2 3 4 5 6 7 8 9 10 | if(isset($_GET['login'])){ $login_status = $_GET['login']; } $http = is_ssl() ? "https" : "http" . "://"; if($login_status == 'failed'){ $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; } else{ $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '?login=failed'; } |
さらに、$login_statusのチェックを入れることで、連続で複数回間違っても付与される?login=failedは1回だけとなります。
※注意事項
開発環境とサーバー環境(本番環境)が相違していると、parse_urlの関数において、動作差分がある場合があります。次の章で詳細を記載します。
3.開発環境、本番環境の環境差分における対処
開発環境では、「2.URLからGETオプションを取り除く」まででOKだったのですが、本番環境(サーバー)環境においては、動作差分のため正常に動作しませんでしたので、その内容も記載させて頂きます。
1 2 3 | (1) $http = is_ssl() ? "https" : "http" . "://"; (2) $redirect_url = $http . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; (3) $redirect_url = parse_url($redirect_url, PHP_URL_PATH); |
サーバー環境では、以下の問題がありました。
問題① (1)の時、$httpが正しく作成されない(“://”が付与されない)。
問題② (3)の時、正常に動作しない(parse_urlの動作差分)。
そのため、以下で対処しました。
1 2 3 4 5 | (1)$redirect_url = ''; (2)$http = is_ssl() ? "https" : "http"; (3)$http .= "://"; (4)$dir = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); (5)$redirect_url = $http . $_SERVER['HTTP_HOST'] . $dir; |
(1)~(3)は、分割する(://)。サーバー環境ではこうしないと動作しない。
(4)先に、GETパラメータを削除しておく
WEB DESIGN全てお任せ!ホームページ制作
RishunTradingでは、日本にはないコンセプトや高いデザイン性をもったヨーロッパ製品の輸入販売、及び、Webサイト制作事業などをおこなっております。
「全てお任せ!ホームページ制作」は、ドメイン取得からサーバー設定、レスポンシブルデザイン(スマホ、タブレット対応)、SEO対策がすべて含まれたお得なホームページを制作するサービス商品です。
運用開始後に「Webサイト運用管理サービス(保守)」と組み合わせて購入しますと、メンテナンス、更新も含めてすべて弊社で実施しますので、お客様は安心して本業に集中する事ができます。
しかもなんと、「全てお任せ!ホームページ制作」は、¥100,000!で提供しております。
本業が忙しい中小企業様に大変ご好評を頂いている商品です。
独自ドメイン取得
サーバー開設&設定
レイアウト設計
レスポンシブルデザイン
(*1)検索エンジン最適化
(SEO対策)場所Maps
お問い合わせフォーム
SSL化
各種SNS連携
運用マニュアル