イントロダクション

Laravelでは簡単に認証が実装できます。実際ほとんど全て最初から設定済みです。認証の設定ファイルはconfig/auth.phpに用意してあり、認証サービスの振る舞いを調整できるように、読みやすいコメント付きでたくさんのオプションが用意されています。

データベースの検討事項

デフォルトととしてLaravelは、App\User Eloquentモデルappディレクトリーに用意しています。このモデルはデフォルトEloquent認証ドライバーで使用しています。もしアプリケーションでEloquentを使用しなければ、Laravelクエリービルダーを使用するdatabase認証ドライバーを使用する必要があります。

App\Userモデルのデータベーススキーマを構築する場合は、passwordカラムを最低60文字確実に確保してください。

さらにusers、もしくは同等の働きをするテーブルには100文字のremember_token文字列カラムも含めてください。このカラムはアプリケーションが管理する"remember me"セッションのトークンを保存しておくカラムです。マイグレーションで$table->rememberToken();を実行すると用意されます。

認証クイックスタート

Laravelでは認証に関連する2つのコントローラーがApp\Http\Controllers\Auth名前空間下に用意されています。AuthControllerは新ユーザーの登録と「ログイン」を処理します。もうひとつのPasswordControllerには、登録済みユーザーがパスワードを忘れた時にリセットするためのロジックが準備されています。必要なメソッドを読み込むために両方のコントローラーでトレイトが使われています。多くのアプリケーションで、これらのコントローラーを変更する必要は全く無いでしょう。

ルート定義

認証コントローラーへリクエストを送るルートはデフォルトで含まれていません。app/Http/routes.phpへ自分で以下の定義を追加してください。

// 認証のルート定義…
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');

// 登録のルート定義…
Route::get('auth/register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');

ビュー

認証のコントローラーはフレームワークに含まれていますが、これらのコントローラーがレンダーするビューは用意する必要があります。ビューはresources/views/authに設置します。これらのビューはお好きなようにカスタマイズしてください。ロジックのビューはresources/views/auth/login.blade.phpへ、登録のビューはresources/views/auth/register.blade.phpへ設置してください。

サンプル認証フォーム

<!-- resources/views/auth/login.blade.php -->

<form method="POST" action="/auth/login">
    {!! csrf_field() !!}

    <div>
        メールアドレス
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        パスワード
        <input type="password" name="password" id="password">
    </div>

    <div>
        <input type="checkbox" name="remember"> ログインを継続する
    </div>

    <div>
        <button type="submit">ログイン</button>
    </div>
</form>

サンプル登録フォーム

<!-- resources/views/auth/register.blade.php -->

<form method="POST" action="/auth/register">
    {!! csrf_field() !!}

    <div>
        ユーザー名
        <input type="text" name="name" value="{{ old('name') }}">
    </div>

    <div>
        メールアドレス
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        パスワード
        <input type="password" name="password">
    </div>

    <div>
        パスワード確認
        <input type="password" name="password_confirmation">
    </div>

    <div>
        <button type="submit">登録</button>
    </div>
</form>

認証

これで用意されている認証コントローラーのルートとビューができました。アプリケーションに新しいユーザーを登録し、認証する準備が整いました。ブラウザで定義したルートへアクセスしてください。認証コントローラーは既にトレイトにより存在しているユーザーの認証と、新しいユーザーをデータベースに保存するロジックを持っています。

ユーザーが認証されるとデフォルトで/home URIへリダイレクトされますが、このルートを変更する必要があるでしょう。認証後のリダイレクト場所はAuthControllerredirectPathプロパティを定義することでカスタマイズできます。

protected $redirectPath = '/dashboard';

ユーザーが認証されていないと/auth/login URIへリダイレクトされます。認証されていない時のリダイレクト先はAuthControllerloginPathプロパティでデフォルトを指定できます。

protected $loginPath = '/login';

ユーザーが保護されているルートへアクセスしようとし、送り返される先をloginPathは変更しません。App\Http\Middleware\Authenticateミドルウェアのhandleメソッドにより制御されています。

カスタマイズ

アプリケーションに新しいユーザーを登録する場合に入力してもらうフォームのフィールドを変更するか、データベースに新しいユーザーレコードの登録方法をカスタマイズしたい場合は、AuthControllerクラスを変更してください。このクラスはアプリケーションで新しいユーザーのバリデーションと作成に責任を持っています。

AuthControllervalidatorメソッドはアプリケーションの新しいユーザーに対するバリデーションルールで構成されています。このメソッドはお気に召すまま自由に変更してください。

AuthControllercreateメソッドは新しいApp\UserレコードをEloquent ORMを使用し、データベースに作成することに責任を持っています。データベースの必要に合わせて自由にこのメソッドを変更してください。

認証済みユーザーの取得

Authファサードを使えば認証済みユーザーへ簡単にアクセスできます。

$user = Auth::user();

もしくは、一度ユーザーが認証されたら、Illuminate\Http\Requestインスタンスを通じ、ユーザーへアクセスできます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class ProfileController extends Controller
{
    /**
     * ユーザープロフィールの項新
     *
     * @param  Request  $request
     * @return Response
     */
    public function updateProfile(Request $request)
    {
        if ($request->user()) {
            // $request->user()は認証済みユーザーのインスタンスを返す…
        }
    }
}

現在のユーザーが認証されているか調べる

ユーザーが既にアプリケーションにログインしているかを調べるには、Authファサードのcheckメソッドが使えます。認証時にtrueを返します。

if (Auth::check()) {
    // ユーザーはログイン済み…
}

しかし特定のルートやコントローラーにユーザーがアクセスする前に、認証済みであるかをミドルウェアにより確認することもできます。より詳細についてはルートの保護のドキュメントを参照してください。

ルートの保護

ルートミドルウェアは特定のルートに許可されたユーザーのみアクセスを許すために使われます。Laravelにはapp\Http\Middleware\Authenticate.phpの中で定義されているauthミドルウェアが最初から用意されています。ルートの定義にこのミドルウェアを指定するだけです。

// ルートクロージャー使用時…

Route::get('profile', ['middleware' => 'auth', function() {
    // 認証済みのユーザーのみ入れる…
}]);

// コントローラー使用時…

Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'ProfileController@show'
]);

もちろんコントローラークラスを使っているならルート定義に付加する代わりに、コントローラーのコンストラクターでmiddlewareメソッドを呼び出すことができます。

public function __construct()
{
    $this->middleware('auth');
}

認証制限

Laravelの組み込みAuthControllerクラスを使用している場合に、アプリケーションのログイン制限を行うにはIlluminate\Foundation\Auth\ThrottlesLoginsトレイトをuseします。デフォルトでは何度も正しくログインできなかった後、一分間ログインできなくなります。制限はユーザーの名前/メールアドレスとIPアドレスで限定されます。

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    // 後略…
}

自前のユーザー認証

もちろん、Laravelに含まれる認証コントローラーを使うことを強要しているわけでありません。これらのコントローラーを削除する選択肢を選ぶのなら、Laravel認証クラスを直接使用しユーザーの認証を管理する必要があります。心配ありません。それでも簡単です!

Laravelの認証サービスにはAuthファサードでアクセスできます。クラスの最初でAuthファサードを確実にインポートしておきましょう。次にattemptメソッドを見てみましょう。

<?php

namespace App\Http\Controllers;

use Auth;
use Illuminate\Routing\Controller;

class AuthController extends Controller
{
    /**
     * 認証の確認作業を処理する
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // 認証通過…
            return redirect()->intended('dashboard');
        }
    }
}

attemptメソッドは最初の引数として、キー/値ペアの配列を受け取ります。配列中の他の値は、データベーステーブルの中からそのユーザーを見つけるために使用されます。ですから、上の例ではemailカラムの値により、ユーザーが取得されます。ユーザーが見つかれば、配列でメソッドに渡されたハッシュ済みのpassword値と、データベースに保存してあったハッシュ済みpasswordが比較されます。2つのハッシュ済みパスワードが一致したら、そのユーザーの新しい認証セッションが開始されます。

attemptメソッドは、認証が成功すればtrueを返します。失敗時はfalseを返します。

リダイレクタ―のintendedメソッドは、認証フィルターにかかる前にアクセスしようとしていたURLへ、ユーザーをリダイレクトしてくれます。そのリダイレクトが不可能な場合の移動先として、フォールバックURIをこのメソッドに指定できます。

お望みであれば、ユーザーのメールアドレスとパスワードに付け加え、認証時のクエリーに追加の条件を指定することも可能です。

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // ユーザーは存在し、アクティブで、利用停止されていない
}

アプリケーションからユーザーをログアウトさせるには、Authファサードのlogoutメソッドを使用してください。これはユーザーセッションの認証情報をクリアします。

Auth::logout();

注意: この例のように、emailを必ず認証に使用しなくてならない訳ではありません。データーベース中にあるユーザー名(username)に該当する、一意にユーザーを特定できるカラムであれば何でも使用できます。

ユーザの継続ログイン

アプリケーションでログイン維持(Remember me)機能を持たせたい場合は、attemptメソッドの第2引数に論理値を指定します。ユーザーが自分でログアウトしない限り、認証が無期限に持続するようになります。もちろん、"remember me"トークンを保存するために使用する文字列のremember_tokenカラムをusersテーブルに持たせる必要があります。

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // $rememberがtrueであれば、このユーザーは覚えられた…
}

この機能を使用している時に、ユーザーが"remember me"クッキーを使用して認証されているかを判定するには、viaRememberメソッドを使用します。

if (Auth::viaRemember()) {
    //
}

他の認証方法

Userインスタンスによる認証

既に存在しているユーザーインスタンスでアプリケーションにログインさせる必要があれば、loginメソッドにそのユーザーインスタンスを指定し呼び出してください。指定されたオブジェクトはIlluminate\Contracts\Auth\Authenticatable契約を実装している必要があります。もちろん、Laravelが用意しているApp\Userモデルはこのインターフェイスを実装しています。

Auth::login($user);

IDによるユーザー認証

ユーザーをアプリケーションへIDによりログインさせる場合は、loginUsingIdメソッドを使います。このメソッドは認証させたいユーザーの主キーだけを引数に受け取ります。

Auth::loginUsingId(1);

ユーザーを一度だけ認証する

onceメソッドを使用すると、アプリケーションにユーザーをそのリクエストの間だけログインさせることができます。セッションもクッキーも使用されないので、ステートレスなAPIを構築する場合に便利です。onceメソッドの引数はattemptメソッドと同じです。

if (Auth::once($credentials)) {
    //
}

HTTP基本認証

HTTP基本認証により、専用の「ログイン」ページを用意しなくても手っ取り早くアプリケーションにユーザーをログインさせられます。これを使用するには、ルートにauth.basicミドルウェアを付けてください。auth.basicミドルウェアはLaravelフレームワークに含まれているので、定義する必要はありません。

Route::get('profile', ['middleware' => 'auth.basic', function() {
    // 認証済みユーザーのみが入れる…
}]);

ミドルウェアをルートに指定すれば、ブラウザーからこのルートへアクセスされると自動的に認証が求められます。デフォルトでは、auth.basicミドルウェアはユーザーを決める"username"としてユーザーのemailカラムを使用します。

FastCGIの注意

PHP FastCGIを使用している場合、初期状態のままでHTTP基本認証は正しく動作しないでしょう。以下の行を.htaccessファイルへ追加してください。

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

ステートレスなHTTP基本認証

セッションの識別クッキーを用いずにHTTP基本認証を使用することもできます。これは特にAPI認証に便利です。実装するには、onceBasicメソッドを呼び出すミドルウェアを定義してください。onceBasicメソッドが何もレスポンスを返さなかった場合、リクエストをアプリケーションの先の処理へ通します。

<?php

namespace Illuminate\Auth\Middleware;

use Auth;
use Closure;

class AuthenticateOnceWithBasicAuth
{
    /**
     * やって来たリクエストの処理
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return Auth::onceBasic() ?: $next($request);
    }

}

次にルートミドルウェアを登録し、ルートに付加します。

Route::get('api/user', ['middleware' => 'auth.basic.once', function() {
    // 認証済みのユーザーのみ入れる…
}]);

パスワードリセット

データベースの検討事項

ほとんどのWebアプリケーションは、パスワードを忘れた場合にリセットする機能をユーザーへ提供しています。アプリケーションを構築するたびごと、何度も実装しなくても済むように、Laravelはパスワードリマインダーを送信し、パスワードをリセットするための便利な手法を提供しています。

これを利用するには、App\UserモデルがIlluminate\Contracts\Auth\CanResetPassword契約を実装しているか確認してください。もちろん、フレームワークに用意されているApp\Userモデルでは、既にこのインターフェイスが実装されています。Illuminate\Auth\Passwords\CanResetPasswordトレイトで、このインターフェイスで実装する必要のあるメソッドが定義されています。

リセットトークンテーブルマイグレーションの生成

次にパスワードリセットトークンを保存しておくためのテーブルを作成します。このテーブルのマイグレーションは、最初からLaravelのdatabase/migrationsディレクトリーに含まれています。ですから、マイグレートするために必要なのは次のコマンド実行だけです。

php artisan migrate

ルーティング

Laravelが用意しているAuth\PasswordControllerはユーザーパスワードをリセットするために必要なロジックを持っています。しかし、このコントローラーに対するルートは定義する必要があります。

// パスワードリセットリンクを要求するルート…
Route::get('password/email', 'Auth\PasswordController@getEmail');
Route::post('password/email', 'Auth\PasswordController@postEmail');

// パスワードリセットルート
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');

ビュー

PasswordControllerへのルート定義に加え、このコントローラーにより返されるビューを準備する必要もあります。心配ありません。取り掛かりやすいようにサンプルビューを提供します。もちろん、お好きなようにフォームを変更してください。

パスワードリセットリンクのリクエストサンプルフォーム

パスワードリセットフォームのためにHTMLビューを用意する必要があります。このビューはresources/views/auth/password.blade.phpとして設置します。このフォームは、パスワードのリセットリンクを受け付けるため、ユーザーのメールアドレスを指定するフィールドを一つ持っています。

<!-- resources/views/auth/password.blade.php -->

<form method="POST" action="/password/email">
    {!! csrf_field() !!}

    @if (count($errors) > 0)
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <div>
        Email
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        <button type="submit">
            パスワードリセットリンクの送信
        </button>
    </div>
</form>

ユーザーがパスワードのリセットをリクエストすると、PasswordControllergetResetメソッドへのリンクを含んだメールを受け取ることになります。通常、ルートは/password/resetです。このメールのビューはresources/views/emails/password.blade.phpです。このビューは、パスワードのリセットを要求したユーザーであるかどうかを確認するための、パスワードリセットトークンを持つ$token変数を受け取ります。取り掛かりやすいでしょうから、メールのサンプルもどうぞ。

<!-- resources/views/emails/password.blade.php -->

パスワードをリセットするためにリンクをクリックしてください。 {{ url('password/reset/'.$token) }}

パスワードリセットサンプルフォーム

ユーザーがパスワードをリセットするためにメールの中のリンクをクリックすると、パスワードリセットフォームが表示されます。このビューはresources/views/auth/reset.blade.phpへ用意してください。

サンプルパスワードフォームをどうぞ。

<!-- resources/views/auth/reset.blade.php -->

<form method="POST" action="/password/reset">
    {!! csrf_field() !!}
    <input type="hidden" name="token" value="{{ $token }}">

    @if (count($errors) > 0)
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <div>
        メールアドレス
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        パスワード
        <input type="password" name="password">
    </div>

    <div>
        パスワード確認
        <input type="password" name="password_confirmation">
    </div>

    <div>
        <button type="submit">
            パスワードリセット
        </button>
    </div>
</form>

パスワードリセット後の処理

ユーザーのパスワードリセットのためにルートとビューを定義したら、あとはブラウザでアクセスしてもらうだけです。フレームワークが用意しているPasswordControllerにはパスワードリセットリンクのメール送信し、データベースのパスワードを更新するロジックが用意されています。

パスワードがリセットされたら、そのユーザーは自動的にアプリケーションにログインされ、/homeへリダイレクトされます。パスワードリセット後のリダイレクト先をカスタマイズするには、PasswordControllerredirectToプロパティを定義してください。

protected $redirectTo = '/dashboard';

注意: パスワードリセットトークンの有効時間はデフォルトで1時間です。config/auth.phpファイルの中のreminder.expireオプションで変更できます。

ソーシャル認証

典型的なフォームを元にした認証に加え、LaravelはLaravel Socialite(ソシエリート:名士)による、OAuthプロバイダーを利用した簡単で便利な認証方法も提供します。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、Bitbucketをサポートしています。

Socialiteを使用する場合、composer.jsonにパッケージを追加してください。

composer require laravel/socialite

設定

Socialiteライブラリをインストールしたら、config/app.php設定ファイルにLaravel\Socialite\SocialiteServiceProviderを登録してください。

'providers' => [
    // 他のサービスプロバイダー

    Laravel\Socialite\SocialiteServiceProvider::class,
],

さらに、app設定ファイルのaliases配列に、Socialiteファサードを追加してください。

'Socialite' => Laravel\Socialite\Facades\Socialite::class,

続いてアプリケーションで使用するOAuthサービスの認証情報を追加する必要があります。認証情報はconfig/services.php設定ファイルで指定します。アプリケーションに必要なプロバイダーによりfacebooktwitterlinkedingooglegithubbitbucketのキーを設定してください。

'github' => [
    'client_id' => 'あなたの-github-app-id',
    'client_secret' => 'あなたの-github-app-secret',
    'redirect' => 'http://あなたの-callback-url',
],

基本的な使用法

これでユーザーを認証する準備ができました!2つのルートを定義する必要があります。一つはOAuthプロバイダーへユーザーをリダイレクトするルート、もう一つは認証後にプロバイダーからのコールバックを受け取るルートです。以下の例では、Socializeファサードを使用しています。

<?php

namespace App\Http\Controllers;

use Socialite;
use Illuminate\Routing\Controller;

class AuthController extends Controller
{
    /**
     * ユーザーをGitHubの認証ページヘリダイレクト
     *
     * @return Response
     */
    public function redirectToProvider()
    {
        return Socialite::driver('github')->redirect();
    }

    /**
     * ユーザーの情報をGitHubから取得
     *
     * @return Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('github')->user();

        // $user->token;
    }
}

redirectメソッドはユーザーをOAuthプロバイダーへ送る面倒を見ます。一方のuserメソッドはリクエストを読み、プロバーダーからのユーザー情報を取得します。ユーザーをリダイレクトする前に、そのリクエストへscopesメソッドで「スコープ」を指定することもできます。このメソッドは既存のスコープを全てオーバーライトします。

return Socialite::driver('github')
            ->scopes(['scope1', 'scope2'])->redirect();

当然ながらコントローラーメソッドへのルートを定義する必要があります。

Route::get('auth/github', 'Auth\AuthController@redirectToProvider');
Route::get('auth/github/callback', 'Auth\AuthController@handleProviderCallback');

多くのOAuthプロバイダーはリダイレクトリクエストでオプションのパラメーターをサポートしています。リクエストにオプションのパラメーターを含めるには連想配列をwithメソッドに渡し、呼び出してください。

return Socialite::driver('google')
            ->with(['hd' => 'example.com'])->redirect();

ユーザーの詳細の取得

ユーザーのインスタンスを取得したら、そのユーザーに関する詳細情報をさらに得られます。

$user = Socialite::driver('github')->user();

// OAuth Two プロバイダー
$token = $user->token;

// OAuth One プロバイダー
$token = $user->token;
$tokenSecret = $user->tokenSecret;

// 全プロバイダー
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();

カスタム認証ドライバーの追加

ユーザーを保存するために伝統的なリレーショナル・データベースを使用していないのなら、自分の認証ドライバー作成するためにLaravelを拡張する必要があります。Authファサードのextendsメソッドで、カスタムドライバーを定義できます。通常extendsは、サービスプロバイダーの中で呼び出します。

<?php

namespace App\Providers;

use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 登録後のサービスの起動処理を実行
     *
     * @return void
     */
    public function boot()
    {
        Auth::extend('riak', function($app) {
            // Illuminate\Contracts\Auth\UserProviderのインスタンスを返す…
            return new RiakUserProvider($app['riak.connection']);
        });
    }

    /**
     * コンテナに結合を登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

extendメソッドでドライバーを登録したら、config.auth.php設定ファイルで新しいドライバーに切り替えます。

Userプロバイダー契約

Illuminate\Contracts\Auth\UserProviderは、MySQLやRiakなどのような持続性のストレージシステムに対するIlluminate\Contracts\Auth\Authenticatableの実装を取得することだけに責任を持っています。これらの2つのインターフェイスはユーザーデータがどのように保存されているか、それを表すのがどんなタイプのクラスなのかに関わらず、認証メカニズムを機能し続けるために役立っています。

Illuminate\Contracts\Auth\UserProvider契約を見てみましょう。

<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider {

    public function retrieveById($identifier);
    public function retrieveByToken($identifier, $token);
    public function updateRememberToken(Authenticatable $user, $token);
    public function retrieveByCredentials(array $credentials);
    public function validateCredentials(Authenticatable $user, array $credentials);

}

retrieveById関数は通常MySQLデータベースの自動増分IDのようなユーザーを表すキーを受け付けます。IDにマッチするAuthenticatable実装が取得され、返されます。

retrieveByToken関数は一意の$identifierremember_tokenフィールドに保存されている"remember me" $tokenからユーザーを取得します。前のメソッドと同じく、Authenticatable実装が返されます。

updateRememberTokenメソッドは$userremember_tokenフィールドを新しい$tokenで更新します。新しいトークンは真新しいものでも、「Remember me」ログインに成功した時の値でも、ログアウト時のnull値でも受け付けます。

retrieveByCredentialsメソッドはアプリケーションにログイン時にAuth::attemptメソッドに指定するのと同じく、ユーザー認証情報の配列を引数に取ります。メソッドは認証情報に一致するユーザーを裏の持続ストレージから「クエリー」する必要があります。典型的な使用方法の場合このメソッドは$credentials['username']の"where"条件でクエリーを実行するでしょう。メソッドはUserInterfaceの実装を返します。このメソッドはパスワードバリデーションや認証を行ってはいけません

validateCredentialsメソッドは指定された$userとユーザーを認証するための$credentialsとを比較します。たとえばこのメソッドは$user->getAuthPassword()文字列と$credentials['password']Hash::makeした値を比較します。このメソッドはユーザーの認証情報のバリデーションだけを行い、論理値を返します。

認証契約

これでUserProviderの各メソッドが明らかになりました。続いてAuthenticatable契約を見てみましょう。プロバイダーはretrieveByIdretrieveByCredentialsメソッドでこのインターフェイスの実装を返していたことを思い出してください。

<?php

namespace Illuminate\Contracts\Auth;

interface Authenticatable {

    public function getAuthIdentifier();
    public function getAuthPassword();
    public function getRememberToken();
    public function setRememberToken($value);
    public function getRememberTokenName();

}

このインターフェイスはシンプルです。getAuthIdentifierメソッドはユーザーの主キーを返します。MySQLを裏で使用している場合、これは自動増分される主キーでしょう。getAuthPasswordはユーザーのハッシュ済みのパスワードを返します。このインターフェイスはどのORMや抽象ストレージ層を使用しているかに関わらず、どんなUserクラスに対しても認証システムが動作するようにしてくれています。デフォルトでLaravelは、このインターフェイスを実装してるappディレクトリーの中のUserクラスを持っています。ですから実装例としてこのクラスを調べてみてください。

イベント

Laravelは認証処理の過程で、様々なイベントを発行します。これらのイベントに対し、EventServiceProviderでリスナーを登録できます。

/**
 * アプリケーションに対するその他のイベントの登録
 *
 * @param  \Illuminate\Contracts\Events\Dispatcher  $events
 * @return void
 */
public function boot(DispatcherContract $events)
{
    parent::boot($events);

    // 認証が試まれるたびに発行される
    $events->listen('auth.attempt', function ($credentials, $remember, $login) {
        //
    });

    // ログインに成功した時に発行される
    $events->listen('auth.login', function ($user, $remember) {
        //
    });

    // ログアウト時に発行される
    $events->listen('auth.logout', function ($user) {
        //
    });
}