質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

ログイン認証について

ssk
ssk

総合スコア328

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

3回答

0リアクション

0クリップ

4168閲覧

投稿2016/06/12 06:17

編集2016/06/13 05:52

ログイン認証ができません。。

$hashesをvar_dumpすると

PHP

array(1) { ["08011111111"]=> string(12) "$2y$10$BOqI." }

と、データベースから情報は取れているようです。
ユーザ認証できないのは何が原因でしょうか?

【参考URL】
http://qiita.com/mpyw/items/bb8305ba196f5105be15

PHP

<?php include('header.php'); ?> <?php require_once __DIR__ . '/functions.php'; require_unlogined_session(); ini_set('display_errors', true); error_reporting(E_ALL); //ユーザから受け取ったユーザ名とパスワード $tel_mail = filter_input(INPUT_POST, 'tel_mail'); $password = filter_input(INPUT_POST, 'password'); try{ //データベース接続 include('./conf/db_con.php'); $sql ='SELECT * FROM user WHERE (tel=:tel_mail OR mail=:tel_mail)'; $stmt=$dbh->prepare($sql); $data[':tel_mail'] = $tel_mail; $stmt->execute($data); $dbh = null; //1行ずつ取り出し $rec = $stmt->fetch(PDO::FETCH_ASSOC); // 事前に生成したユーザごとのパスワードハッシュの配列 $hashes = [ $tel_mail => $rec['password'], ]; }catch(Exception $e){ print 'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } // POSTメソッドのときのみ実行 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ( validate_token(filter_input(INPUT_POST, 'token')) && password_verify( $password, isset($hashes[$tel_mail]) ? $hashes[$tel_mail] : '$2y$10$abcdefghijklmnopqrstuv' // ユーザ名が存在しないときだけ極端に速くなるのを防ぐ ) ) { // 認証が成功したとき // セッションIDの追跡を防ぐ session_regenerate_id(true); // ユーザ名をセット session_start();//合言葉を決める $_SESSION['login']=1;//ログインOKの証拠を残す $_SESSION['user_id']=$rec['user_id']; // ログイン完了後に / に遷移 header('Location: /index.php'); exit; } // 認証が失敗したとき // 「403 Forbidden」 http_response_code(403); } header('Content-Type: text/html; charset=UTF-8'); ?> <main id="regist"> <div class="container"> <section class="container"> <?php var_dump($hashes[$tel_mail]); ?> <form class="form-horizontal" action="" method="post"> <fieldset> <div class="clearfix"></div><br> <div class="input-group input-group-lg"> <span class="input-group-addon"><i class="glyphicon glyphicon-user red"></i></span> <input type="text" class="form-control" placeholder="電話番号またはメールアドレス" name="tel_mail"> </div> <div class="clearfix"></div><br> <div class="input-group input-group-lg"> <span class="input-group-addon"><i class="glyphicon glyphicon-lock red"></i></span> <input type="password" class="form-control" placeholder="パスワード" name="password"> </div> <div class="clearfix"></div> <div class="col-sm-12"> <button type="submit" class="btn btn-default center-block">ログイン</button> </div> </fieldset> <input type="hidden" name="token" value="<?=h(generate_token())?>"> </form> <?php if (http_response_code() === 403): ?> <p style="color: red;">ユーザ名またはパスワードが違います</p> <?php endif; ?> </section> </div> </main> <?php include('footer.php'); ?>

functions.php

PHP

<?php /** * ログイン状態によってリダイレクトを行うsession_startのラッパー関数 * 初回時または失敗時にはヘッダを送信してexitする */ function require_unlogined_session() { // セッション開始 @session_start(); // ログインしていれば / に遷移 if (isset($_SESSION['user_id'])) { header('Location: /'); exit; } } function require_logined_session() { // セッション開始 @session_start(); // ログインしていなければ /login.php に遷移 if (!isset($_SESSION['user_id'])) { header('Location: ./login.php'); exit; } } /** * CSRFトークンの生成 * * @return string トークン */ function generate_token() { // セッションIDからハッシュを生成 return hash('sha256', session_id()); } /** * CSRFトークンの検証 * * @param string $token * @return bool 検証結果 */ function validate_token($token) { // 送信されてきた$tokenがこちらで生成したハッシュと一致するか検証 return $token === generate_token(); } /** * htmlspecialcharsのラッパー関数 * * @param string $str * @return string */ function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } ?>

データベースはuserというテーブルで
tel
mail
password

と、構成されています。

【追記】
エラーは発生していません。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

omusoba

2016/06/12 07:27

実際に今のコードで動かしてログイン認証ができないということはどこでエラーが発生していますか?
退会済みユーザー

退会済みユーザー

2016/06/12 09:45

回答者が回答に必要な最低限の情報は提示してください。
ssk

2016/06/12 09:48

Kosuke_Shibuya様 1ページすべての内容を提示したのですが その他にどのような情報が必要でしょうか?
退会済みユーザー

退会済みユーザー

2016/06/12 09:52 編集

どこまで処理が進んでいるのか。requireしているファイルの中身とか、デバッグもできませんよ。回答者はコードをただ眺めて回答しているわけじゃありません。実際にコードを実行してみて問題点を探ります。DBの定義だって必要な情報ではありませんか?
omusoba

2016/06/12 10:11 編集

そうですね....答えを聞く限り、認証できないということはhttp_response_code(403);に進むということですよね?validate_tokenと password_verifyの結果自体はデバック時などに確認して結果はどうでしたか?
ssk

2016/06/13 05:53

Kosuke_Shibuya様 情報を追加しました。 いかがでしょう、、よろしくお願い致します。
ssk

2016/06/13 05:54

omusoba様 http_response_code(403);に進むということですよね? ↑仰る通りです。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。