ログイン認証ができません。。
$hashesをvar_dumpすると
PHP
1array(1) { ["08011111111"]=> string(12) "$2y$10$BOqI." }
と、データベースから情報は取れているようです。
ユーザ認証できないのは何が原因でしょうか?
【参考URL】
http://qiita.com/mpyw/items/bb8305ba196f5105be15
PHP
1<?php include('header.php'); ?> 2<?php 3require_once __DIR__ . '/functions.php'; 4require_unlogined_session(); 5ini_set('display_errors', true); 6error_reporting(E_ALL); 7//ユーザから受け取ったユーザ名とパスワード 8 $tel_mail = filter_input(INPUT_POST, 'tel_mail'); 9 $password = filter_input(INPUT_POST, 'password'); 10 11try{ 12 //データベース接続 13 include('./conf/db_con.php'); 14 $sql ='SELECT * FROM user WHERE (tel=:tel_mail OR mail=:tel_mail)'; 15 $stmt=$dbh->prepare($sql); 16 $data[':tel_mail'] = $tel_mail; 17 $stmt->execute($data); 18 $dbh = null; 19 //1行ずつ取り出し 20 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 21 // 事前に生成したユーザごとのパスワードハッシュの配列 22 $hashes = [ 23 $tel_mail => $rec['password'], 24 ]; 25}catch(Exception $e){ 26 print 'ただいま障害により大変ご迷惑をお掛けしております。'; 27 exit(); 28} 29 30// POSTメソッドのときのみ実行 31if ($_SERVER['REQUEST_METHOD'] === 'POST') { 32 if ( 33 validate_token(filter_input(INPUT_POST, 'token')) && 34 password_verify( 35 $password, 36 isset($hashes[$tel_mail]) 37 ? $hashes[$tel_mail] 38 : '$2y$10$abcdefghijklmnopqrstuv' // ユーザ名が存在しないときだけ極端に速くなるのを防ぐ 39 ) 40 ) { 41 // 認証が成功したとき 42 // セッションIDの追跡を防ぐ 43 session_regenerate_id(true); 44 // ユーザ名をセット 45 session_start();//合言葉を決める 46 $_SESSION['login']=1;//ログインOKの証拠を残す 47 $_SESSION['user_id']=$rec['user_id']; 48 // ログイン完了後に / に遷移 49 header('Location: /index.php'); 50 exit; 51 } 52 // 認証が失敗したとき 53 // 「403 Forbidden」 54 http_response_code(403); 55} 56 57header('Content-Type: text/html; charset=UTF-8'); 58 59?> 60<main id="regist"> 61<div class="container"> 62 <section class="container"> 63 <?php var_dump($hashes[$tel_mail]); ?> 64 <form class="form-horizontal" action="" method="post"> 65 <fieldset> 66 <div class="clearfix"></div><br> 67 <div class="input-group input-group-lg"> 68 <span class="input-group-addon"><i class="glyphicon glyphicon-user red"></i></span> 69 <input type="text" class="form-control" placeholder="電話番号またはメールアドレス" name="tel_mail"> 70 </div> 71 <div class="clearfix"></div><br> 72 <div class="input-group input-group-lg"> 73 <span class="input-group-addon"><i class="glyphicon glyphicon-lock red"></i></span> 74 <input type="password" class="form-control" placeholder="パスワード" name="password"> 75 </div> 76 <div class="clearfix"></div> 77 <div class="col-sm-12"> 78 <button type="submit" class="btn btn-default center-block">ログイン</button> 79 </div> 80 </fieldset> 81 <input type="hidden" name="token" value="<?=h(generate_token())?>"> 82</form> 83<?php if (http_response_code() === 403): ?> 84<p style="color: red;">ユーザ名またはパスワードが違います</p> 85<?php endif; ?> 86 </section> 87</div> 88</main> 89<?php include('footer.php'); ?>
functions.php
PHP
1<?php 2 3/** 4 * ログイン状態によってリダイレクトを行うsession_startのラッパー関数 5 * 初回時または失敗時にはヘッダを送信してexitする 6 */ 7function require_unlogined_session() 8{ 9 // セッション開始 10 @session_start(); 11 // ログインしていれば / に遷移 12 if (isset($_SESSION['user_id'])) { 13 header('Location: /'); 14 exit; 15 } 16} 17function require_logined_session() 18{ 19 // セッション開始 20 @session_start(); 21 // ログインしていなければ /login.php に遷移 22 if (!isset($_SESSION['user_id'])) { 23 header('Location: ./login.php'); 24 exit; 25 } 26} 27 28/** 29 * CSRFトークンの生成 30 * 31 * @return string トークン 32 */ 33function generate_token() 34{ 35 // セッションIDからハッシュを生成 36 return hash('sha256', session_id()); 37} 38 39/** 40 * CSRFトークンの検証 41 * 42 * @param string $token 43 * @return bool 検証結果 44 */ 45function validate_token($token) 46{ 47 // 送信されてきた$tokenがこちらで生成したハッシュと一致するか検証 48 return $token === generate_token(); 49} 50 51/** 52 * htmlspecialcharsのラッパー関数 53 * 54 * @param string $str 55 * @return string 56 */ 57function h($str) 58{ 59 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 60} 61?>
データベースはuserというテーブルで
tel
mail
password
と、構成されています。
【追記】
エラーは発生していません。
回答3件
あなたの回答
tips
プレビュー