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

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

ただいまの
回答率

91.05%

  • PHP

    17223questions

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

  • Laravel 5

    1346questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Laravel ログイン機能の実装

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 197

S.N.

score 7

はじめに

  • Laravelにて、CRUD系のアプリを作っています。
  • ユーザ回りの機能を実装し始めて、認証がうまくできないため困っています。
  • Authファサードをつかえるようにして、Auth::attemptを利用するやり方を採用しています。
  • ちなみに、「$php artisan make:auth」でログイン機能を作れることを後から知り、かつ
    そのほうがセキュアな気もしますが、とりあえず始めてしまったのでこの方法でトライさせてください。

コード

//登録ページの処理、パスワードはハッシュ化しています
public function store(Request $request){
    $name = $request->input('name');
    $email = $request->input('email');
    $password = Hash::make($request->input('password'));
    $this->validate($request, [
      'name' => 'required|unique:user|max:255',
      'email' => 'required|unique:user|max:60',
      'password' => 'required|max:60'
    ]);
    DB::table('user')
          ->insertGetId(['name' => $name, 'email' => $email, 'password' => $password]);
    $request->session()->flash('flash', 'You are Registered Now');
    return redirect()->to('database/');
  }

//認証ページの処理です
public function authenticate(Request $request){
    $email = $request->input('email');
    $password = $request->input('password');
    $credidentials = ['email' => $email, 'password' => $password];
    if (Auth::attempt($credidentials)){
      $request->session()->flash('flash', 'Log in Completed');
      return redirect()->intended('database/');
    }else{
      $request->session()->flash('flash', 'Email or Password invalid');
      return redirect()->to('database/user/auth');
    }
  }

//認証ページのフォーム(auth.blade.php)です
@extends('top')
@section('content')
<div>
    <div>
      <form action = "authenticate" method = "post">
          <li> <input type = "text" name = "email" placeholder = "Type Email"> </li>
          <li> <input type = "password" name = "password" placeholder = "Password"> </li>
          <input type = "hidden" name="_token" value="{{csrf_token()}}">
          <button type = "submit">Log in</button>
      </form>
      <a href = "{{ action( 'ArtistController@top' ) }}">Back to top</a>
    </div>
</div>
@endsection

実行結果

  • auth.blade.phpからメールとパスを打つと、「Email or Password invalid」が表示される、つまりログインに失敗している
    のですが、それがなぜなのかわかりません。
  • メールとパスが一致していることは大前提としてあります。

実行の結果から、なぜ情報が一致しないのか、自分では調べてもいまいち掴めませんでしたので
お力添えいただけますと幸いです。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ユーザの保存の仕方も、Auth::attemptを使った認証の仕方も、Laravel本体のコードと見比べても特に問題ないように見えます・・・。
あとは些細な問題があるのかを見ていくのかなという印象です。

ちょっと気になるのはデフォルトのユーザテーブルは user ではなく users なのですが、そこはおそらく御自身で作られたテーブルなのでたぶん大丈夫なのだと思っています。(users はdatabase/migrations/2014_10_12_000000_create_users_table.phpで作られているテーブルです
逆に言うと自分でユーザテーブルを作ってしまうと、Laravelの求めるスキーマと違ってしまうことがありそうで少し不安ではあります。

後はtypoとかDBに目的のデータがちゃんと保存されているかという懸念なのですが、ユーザ新規登録後にDBに目的のデータは保存されていますでしょうか?
仮に保存に成功してもパスワードは目的のパスワードのハッシュが保存されていますでしょうか?
上記のバリデーションルールだと仮にパスワードの空文字だったとしても通ってしまうので、仮にhtmlのformをどこかtypoしてて、パスワードがPOSTされてなくても通ってしまうと思います。

    $name = $request->input('name');
    $email = $request->input('email');
    $password = Hash::make($request->input('password'));  // パスワードが空でもハッシュは生成されるので下のバリデーションはまず通過してしまう!
    $this->validate($request, [
      'name' => 'required|unique:user|max:255',
      'email' => 'required|unique:user|max:60',
      'password' => 'required|max:60'
    ]);

参考
Laravelがパスワードハッシュ生成に使っているpassword_hashは空文字だろうがnullだろうがハッシュを生成する・・・・・。

>>> password_hash('test', PASSWORD_DEFAULT);
=> "$2y$10$u7D0s6uj1gqkXsnu8a/iUu4ZJ.ysHsTga5X1libNpcFt9yifQj/6K"
>>> password_hash('', PASSWORD_DEFAULT);
=> "$2y$10$WRNEIkZbDjRtWs4B1ZDa3OlLPurPAImce8KtW5q7OnYmy1CJXBD3e"
>>> password_hash(null, PASSWORD_DEFAULT);
=> "$2y$10$1QxZ.XuvEx4600RY4GJsyeazD0gnRnrzejjV8LsmXq3lTUI.eUjea"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/28 14:54 編集

    あ、あと config/auth.php の 'guards' 配下と、 'providers' 配下もよろしければ記述していただくとうれしいです。
    デフォルトだとたしかUserモデル(app/User.php)を経由したログイン認証を実行するのですが、上記のやり方だとまず認証に失敗するのかなと思います。

    キャンセル

  • 2017/12/28 12:52

    ご回答いただきありがとうございます。めちゃくちゃ勉強になりました。上からコメントいたします。

    ・userテーブルについて
    ご推察いただきましたように、これは私が自作したテーブルです。また、新規登録後に、私はMysqlをつかっていますが、workbench上でレコードが入っていることを確認しています。

    ・パスワードについて
    空文字でもハッシュというのは知りませんでした。。論理的に考えればたしかにそうなりますよね。
    ヴァリデーションの意味。。

    ・config/auth.phpについて
    設定は、いじっていないので下記のようになっています。
    'guards' => [
    'web' => [
    'driver' => 'session',
    'provider' => 'users',
    ],

    'api' => [
    'driver' => 'token',
    'provider' => 'users',
    ],
    ],

    'providers' => [
    'users' => [
    'driver' => 'eloquent',
    'model' => App\User::class,
    ],

    // 'users' => [
    // 'driver' => 'database',
    // 'table' => 'users',
    // ],
    ],

    キャンセル

  • 2017/12/28 13:07

    なるほどなるほど、config/auth.phpの'provider'を以下に書き換えてみるとログイン認証はできるようになりますでしょうか?

    ```
    'providers' => [
    // こっちはコメントアウト
    // 'users' => [
    // 'driver' => 'eloquent',
    // 'model' => \App\DataAccess\Eloquent\User::class,
    // ],

    // コメントアウト解除
    'users' => [
    'driver' => 'database',
    'table' => 'user', // 「今回の場合は」 users->userへ修正
    ],
    ],
    ```

    キャンセル

  • 2017/12/28 19:00

    アドバイスありがとうございます。
    書き換えてみまして、「Undefined index: id」というエラーにはなりましたが、検索・一致のロジック単体ではワークしている感じです。
    ご丁寧にありがとうございました!

    キャンセル

0

Auth::attempt 内の挙動を追うのが早そうですが、追いましたか?

ここを見ると $password をナマのまま渡すのが NG とかっぽいです。

ただ、感覚的にはおかしな記述な気がするので、やっぱり挙動を追ってみるのが良いかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/28 08:52

    ご回答ありがとうございます。

    いえ、まだ追ってないですね。SELECTのときに、デハッシュするのかなと思っていて変に思いましたが、やはりそうですよね。
    そのへんにあたりをつけていろいろ調査します、ありがとうございます。

    キャンセル

  • 2017/12/28 08:59

    私は laravel を学習しようとしている段階にあるので、laravel の認証の常套手法は知らないのですが、ハッシュした後の値を渡す関数となると、なんかそもそも使い方が今のやり方と違う気がします。
    もし、リンク先の記述通りの動きをするものなのであれば、使用方法の確認をしたほうが良いかもしれません。

    キャンセル

  • 2017/12/28 09:02

    そうなんですね。
    上記の記法は、ドキュメント(https://readouble.com/laravel/5.5/ja/authentication.html)を参考に書いてみたんです。

    と思ってもう一度みたら、自動でハッシュ化されるから登録時にハッシュにしてはダメってなってました。。
    ごめんなさい、再チャレンジしてみます。

    キャンセル

  • 2017/12/28 09:06

    あぁ、理解しました!
    laravel が Ver ごとに仕様が違うって、こういうことなんですね^^;
    勉強になりました。

    キャンセル

  • 2017/12/28 09:07

    te2jiさんが、5.5以前のLaravelをイメージされていた、とかでしょうか。
    逆に学びになったようで、コメントいただき嬉しかったです。

    キャンセル

  • 2017/12/28 09:25

    いえ、私の回答したリンク先が5.5以前の laravel の記述であっただけで、私はもっと入り口にいる状況です。
    マイナーバージョンの違いで、ここまで差が出るものなんですね。。。こわい^^;

    キャンセル

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

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    17223questions

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

  • Laravel 5

    1346questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。