イントロダクションIntroduction
">Tip!! さくっと始めたいですか? 真新しくインストールしたLaravelアプリケーションに
laravel/ui
Composerパッケージをインストールし、php artisan ui vue --auth
を実行してください。データベースをマイグレーションし、http://your-app.test/register
かアプリケーションに割り付けた別のURLをブラウザでアクセスしましょう。これらのコマンドが、認証システム全体のスカフォールドの面倒を見ます。{tip} Want to get started fast? Install thelaravel/ui
Composer package and runphp artisan ui vue --auth
in a fresh Laravel application. After migrating your database, navigate your browser tohttp://your-app.test/register
or any other URL that is assigned to your application. These commands will take care of scaffolding your entire authentication system!
Laravelでは簡単に認証が実装できます。実のところ、ほぼすべて最初から設定済みです。認証の設定ファイルはconfig/auth.php
に用意してあり、認証サービスの振る舞いを調整できるように、読みやすいコメント付きでたくさんのオプションが用意されています。Laravel makes implementing authentication very simple. In fact, almost everything is configured for you out of the box. The authentication configuration file is located at config/auth.php
, which contains several well documented options for tweaking the behavior of the authentication services.
Laravelの認証機能は「ガード」と「プロバイダ」を中心概念として構成されています。ガードは各リクエストごとに、どのようにユーザーを認証するかを定義します。たとえば、Laravelにはセッションストレージとクッキーを使いながら状態を維持するsession
ガードが用意されています。At its core, Laravel's authentication facilities are made up of "guards" and "providers". Guards define how users are authenticated for each request. For example, Laravel ships with a session
guard which maintains state using session storage and cookies.
プロバイダは永続ストレージから、どのようにユーザーを取得するかを定義します。LaravelはEloquentとデータベースクリエビルダを使用しユーザーを取得する機能を用意しています。しかし、アプリケーションの必要性に応じて、自由にプロバイダを追加できます。Providers define how users are retrieved from your persistent storage. Laravel ships with support for retrieving users using Eloquent and the database query builder. However, you are free to define additional providers as needed for your application.
混乱しても心配ありません。通常のアプリケーションでは、デフォルトの認証設定を変更する必要はありません。Don't worry if this all sounds confusing now! Many applications will never need to modify the default authentication configuration.
データベースの検討事項Database Considerations
デフォルトとしてLaravelは、App\User
Eloquentモデルをapp
ディレクトリに用意しています。このモデルはデフォルトEloquent認証ドライバで使用しています。もしアプリケーションでEloquentを使用しなければ、Laravelクエリビルダを使用するdatabase
認証ドライバを使用する必要があります。By default, Laravel includes an App\User
Eloquent model[/docs/{{version}}/eloquent] in your app
directory. This model may be used with the default Eloquent authentication driver. If your application is not using Eloquent, you may use the database
authentication driver which uses the Laravel query builder.
App\User
モデルのデータベーススキマー構築時に、確実にパスワードカラムを最低60文字確保してください。デフォルトの255文字にするのが、良い方法でしょう。When building the database schema for the App\User
model, make sure the password column is at least 60 characters in length. Maintaining the default string column length of 255 characters would be a good choice.
さらにusers
、もしくは同等の働きをするテーブルには、100文字のremember_token
文字列カラムも含めてください。このカラムはログイン時に、アプリケーションで"remember me"を選んだユーザーのトークンを保存しておくカラムとして使用されます。Also, you should verify that your users
(or equivalent) table contains a nullable, string remember_token
column of 100 characters. This column will be used to store a token for users that select the "remember me" option when logging into your application.
認証クイックスタートAuthentication Quickstart
ルート定義Routing
Laravelのlaravel/ui
パッケージは、認証に必要なルートとビューをすべてあっという間にスカフォールドするための、シンプルなコマンドを少々提供しています。Laravel's laravel/ui
package provides a quick way to scaffold all of the routes and views you need for authentication using a few simple commands:
composer require laravel/ui
php artisan ui vue --auth
このコマンドは新しくインストールしたアプリケーションでのみ実行すべきで、レイアウトビュー、登録ログインビューをインストールし、同時にすべての認証エンドポイントのルートも定義します。HomeController
も、ログイン後に必要となる、アプリケーションのダッシュボードのために生成されます。This command should be used on fresh applications and will install a layout view, registration and login views, as well as routes for all authentication end-points. A HomeController
will also be generated to handle post-login requests to your application's dashboard.
laravel/ui
パッケージはたくさんの事前に用意した認証コントローラも生成します。生成したコントローラは、App\Http\Controllers\Auth
名前空間に位置づけられます。RegisterController
は新しいユーザーの登録を処理します。LoginController
は認証を処理します。ForgotPasswordController
はパスワードリセットに使用するメールからのリンクを処理します。ResetPasswordController
はパスワードリセットのロジック部分です。それぞれのコントローラは必要なメソッドを含んだトレイトを使用しています。大抵のアプリケーションではこれらのコントローラを変更する必要はまったくないでしょう。The laravel/ui
package also generates several pre-built authentication controllers, which are located in the App\Http\Controllers\Auth
namespace. The RegisterController
handles new user registration, the LoginController
handles authentication, the ForgotPasswordController
handles e-mailing links for resetting passwords, and the ResetPasswordController
contains the logic to reset passwords. Each of these controllers uses a trait to include their necessary methods. For many applications, you will not need to modify these controllers at all.
">Tip!! アプリケーションでユーザー登録が必要なければ、新しく作成された
RegisterController
を削除し、ルート定義をAuth::routes(['register' => false]);
のように変更すれば、無効にできます。{tip} If your application doesn’t need registration, you may disable it by removing the newly createdRegisterController
and modifying your route declaration:Auth::routes(['register' => false]);
.
認証を含むアプリケーションの生成Creating Applications Including Authentication
認証のスカフォールドを含む、真新しいアプリケーションを開始したい場合は、生成時に--auth
ディレクティブを使用します。以下のコマンドで認証をインストールし、すべてのスカフォールドをコンパイルした新規アプリケーションを生成します。If you are starting a brand new application and would like to include the authentication scaffolding, you may use the --auth
directive when creating your application. This command will create a new application with all of the authentication scaffolding compiled and installed:
laravel new blog --auth
ビューViews
前のセクションで説明したように、laravel/ui
パッケージのphp artisan ui vue --auth
コマンドで、認証に必要なすべてのビューがresources/views/auth
ディレクトリに生成されます。As mentioned in the previous section, the laravel/ui
package's php artisan ui vue --auth
command will create all of the views you need for authentication and place them in the resources/views/auth
directory.
ui
コマンドはアプリケーションのベースレイアウトを含む、resources/views/layouts
ディレクトリも生成します。これらのビューはすべてBootstrap CSSフレームワークを使用していますが、お好みに合わせて自由にカスタマイズしてください。The ui
command will also create a resources/views/layouts
directory containing a base layout for your application. All of these views use the Bootstrap CSS framework, but you are free to customize them however you wish.
認証Authenticating
これで、認証コントローラを含め、必要なルートとビューの準備が整いました。アプリケーションに新しいユーザーを登録し、認証できるようになりました。ブラウザでアプリケーションへアクセスしてください。認証コントローラは(内部で使用しているトレイトにより)、既存ユーザーの認証と、新しいユーザーをデータベースへ保存するロジックをすでに備えています。Now that you have routes and views setup for the included authentication controllers, you are ready to register and authenticate new users for your application! You may access your application in a browser since the authentication controllers already contain the logic (via their traits) to authenticate existing users and store new users in the database.
パスのカスタマイズPath Customization
ユーザーが認証に成功すると、/home
のURIへリダイレクトします。認証後のリダイレクトパスをカスタマイズするには、RouteServiceProvider
の中でHOME
定数を定義してください。When a user is successfully authenticated, they will be redirected to the /home
URI. You can customize the post-authentication redirect path using the HOME
constant defined in your RouteServiceProvider
:
public const HOME = '/home';
ユーザー認証時に返されるレスポンスのより堅牢なカスタマイズが必要な場合のため、LaravelはAuthenticatesUsers
トレイトに空のauthenticated(Request $request、$user)
メソッドを用意しています。このトレイトは、laravel/ui
パッケージを使用するときにアプリケーションへインストールされる、LoginController
クラスで使用されます。そのため、LoginController
クラスで独自のauthenticated
メソッドを定義可能です。If you need more robust customization of the response returned when a user is authenticated, Laravel provides an empty authenticated(Request $request, $user)
method within the AuthenticatesUsers
trait. This trait is used by the LoginController
class that is installed into your application when using the laravel/ui
package. Therefore, you can define your own authenticated
method within the LoginController
class:
/**
* ユーザーが認証された
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
return response([
//
]);
}
ユーザー名のカスタマイズUsername Customization
デフォルトでLaravelはemail
フィールドを認証に利用します。これをカスタマイズしたい場合は、LoginController
でusername
メソッドを定義してください。By default, Laravel uses the email
field for authentication. If you would like to customize this, you may define a username
method on your LoginController
:
public function username()
{
return 'username';
}
ガードのカスタマイズGuard Customization
さらに、登録済みユーザーを認証するために使用する「ガード」をカスタマイズすることも可能です。LoginController
、 RegisterController
、ResetPasswordController
でguard
メソッドを定義してください。メソッドからガードインスタンスを返してください。You may also customize the "guard" that is used to authenticate and register users. To get started, define a guard
method on your LoginController
, RegisterController
, and ResetPasswordController
. The method should return a guard instance:
use Illuminate\Support\Facades\Auth;
protected function guard()
{
return Auth::guard('guard-name');
}
バリデーション/保管域のカスタマイズValidation / Storage Customization
アプリケーションに新しいユーザーを登録する場合に入力してもらうフォームのフィールドを変更するか、データベースに新しいユーザーレコードを登録する方法をカスタマイズしたい場合は、RegisterController
クラスを変更してください。このクラスはアプリケーションで新しいユーザーのバリデーションと作成に責任を持っています。To modify the form fields that are required when a new user registers with your application, or to customize how new users are stored into your database, you may modify the RegisterController
class. This class is responsible for validating and creating new users of your application.
RegisterController
のvalidator
メソッドはアプリケーションの新しいユーザーに対するバリデーションルールで構成されています。このメソッドはお気に召すまま自由に変更してください。The validator
method of the RegisterController
contains the validation rules for new users of the application. You are free to modify this method as you wish.
RegisterController
のcreate
メソッドは新しいApp\User
レコードをEloquent ORMを使用し、データベースへ作成することに責任を持っています。データベースの必要に合わせて自由にこのメソッドを変更してください。The create
method of the RegisterController
is responsible for creating new App\User
records in your database using the Eloquent ORM[/docs/{{version}}/eloquent]. You are free to modify this method according to the needs of your database.
認証済みユーザーの取得Retrieving The Authenticated User
Auth
ファサードを使えば認証済みユーザーへ簡単にアクセスできます。You may access the authenticated user via the Auth
facade:
use Illuminate\Support\Facades\Auth;
// 現在認証されているユーザーの取得
$user = Auth::user();
// 現在認証されているユーザーのID取得
$id = Auth::id();
もしくは、ユーザーが認証済みであれば、Illuminate\Http\Request
インスタンス経由で、ユーザーへアクセスすることもできます。コントローラメソッドでタイプヒントしたクラスは、自動的にインスタンスが依存注入されることを思い出してください。Alternatively, once a user is authenticated, you may access the authenticated user via an Illuminate\Http\Request
instance. Remember, type-hinted classes will automatically be injected into your controller methods:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* ユーザープロフィールの更新
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// $request->user()は認証済みユーザーのインスタンスを返す
}
}
現在のユーザーが認証されているか調べるDetermining If The Current User Is Authenticated
ユーザーがすでにアプリケーションにログインしているかを調べるには、Auth
ファサードのcheck
メソッドが使えます。認証時にtrue
を返します。To determine if the user is already logged into your application, you may use the check
method on the Auth
facade, which will return true
if the user is authenticated:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// ユーザーはログインしている
}
">Tip!!
check
メソッドを使っても、あるユーザーが認証済みであるかを判定可能です。特定のルートやコントローラへユーザーをアクセスさせる前に、認証済みであるかをミドルウェアにより確認する場面で、典型的に使用します。より詳細についてはルートの保護のドキュメントを参照してください。{tip} Even though it is possible to determine if a user is authenticated using thecheck
method, you will typically use a middleware to verify that the user is authenticated before allowing the user access to certain routes / controllers. To learn more about this, check out the documentation on protecting routes[/docs/{{version}}/authentication#protecting-routes].
ルートの保護Protecting Routes
ルートミドルウェアは特定のルートに対し、認証済みユーザーのみアクセスを許すために使われます。LaravelにはIlluminate\Auth\Middleware\Authenticate
の中で定義されているauth
ミドルウェアが最初から用意されています。このミドルウェアは、HTTPカーネルで登録済みのため、必要なのはルート定義でこのミドルウェアを指定するだけです。Route middleware[/docs/{{version}}/middleware] can be used to only allow authenticated users to access a given route. Laravel ships with an auth
middleware, which is defined at Illuminate\Auth\Middleware\Authenticate
. Since this middleware is already registered in your HTTP kernel, all you need to do is attach the middleware to a route definition:
Route::get('profile', function() {
// 認証済みのユーザーのみが入れる
})->middleware('auth');
コントローラを使っていれば、ルート定義へ付加する代わりに、コントローラのコンストラクターでmiddleware
メソッドを呼び出すことができます。If you are using controllers[/docs/{{version}}/controllers], you may call the middleware
method from the controller's constructor instead of attaching it in the route definition directly:
public function __construct()
{
$this->middleware('auth');
}
未認証ユーザーのリダイレクトRedirecting Unauthenticated Users
ミドルウェアが未認証ユーザーを突き止めると、ユーザーをlogin
名前付きルートへリダイレクトします。この振る舞いは、app/Http/Middleware/Authenticate.php
ファイルのredirectTo
関数で変更できます。When the auth
middleware detects an unauthorized user, it will redirect the user to the login
named route[/docs/{{version}}/routing#named-routes]. You may modify this behavior by updating the redirectTo
function in your app/Http/Middleware/Authenticate.php
file:
/**
* ユーザーをリダイレクトさせるパスの取得
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
return route('login');
}
ガードの指定Specifying A Guard
auth
ミドルウェアをルートに対し指定するときに、そのユーザーに対し認証を実行するガードを指定することもできます。指定されたガードは、auth.php
設定ファイルのguards
配列のキーを指定します。When attaching the auth
middleware to a route, you may also specify which guard should be used to authenticate the user. The guard specified should correspond to one of the keys in the guards
array of your auth.php
configuration file:
public function __construct()
{
$this->middleware('auth:api');
}
パスワード確認Password Confirmation
アプリケーションの特定の領域へアクセスを許す前に、パスワードの確認を要求したい場合もあります。たとえば、アプリケーションでユーザーが支払いの設定を変更する前に、この確認を行ったほうが良いでしょう。Sometimes, you may wish to require the user to confirm their password before accessing a specific area of your application. For example, you may require this before the user modifies any billing settings within the application.
このためにLaravelは、password.confirm
ミドルウェアを提供しています。password.confirm
ミドルウェアを指定したルートはパスワード確認のスクリーンへリダイレクトされ、続けるには入力する必要があります。To accomplish this, Laravel provides a password.confirm
middleware. Attaching the password.confirm
middleware to a route will redirect users to a screen where they need to confirm their password before they can continue:
Route::get('/settings/security', function () {
// ユーザーは続けるためにパスワードの入力が必要
})->middleware(['auth', 'password.confirm']);
ユーザーがパスワード確認に成功すると、最初にアクセスしようとしていたルートへリダイレクトされます。デフォルトではパスワード確認後、そのユーザーは3時間パスワードを再確認する必要はありません。auth.password_timeout
設定オプションを使用すれば、再確認までの時間をカスタマイズできます。After the user has successfully confirmed their password, the user is redirected to the route they originally tried to access. By default, after confirming their password, the user will not have to confirm their password again for three hours. You are free to customize the length of time before the user must re-confirm their password using the auth.password_timeout
configuration option.
認証回数制限Login Throttling
Laravelの組み込みLoginController
クラスを使用している場合、Illuminate\Foundation\Auth\ThrottlesLogins
トレイトが最初からコントローラで取り込まれています。デフォルトでは何度も正しくログインできなかった後、一分間ログインできなくなります。制限はユーザーの名前/メールアドレスとIPアドレスで限定されます。If you are using Laravel's built-in LoginController
class, the Illuminate\Foundation\Auth\ThrottlesLogins
trait will already be included in your controller. By default, the user will not be able to login for one minute if they fail to provide the correct credentials after several attempts. The throttling is unique to the user's username / e-mail address and their IP address.
自前のユーザー認証Manually Authenticating Users
Laravelに含まれる、認証コントローラを使うよう強要しているわけではないことに留意してください。これらのコントローラを削除する選択肢を選ぶのなら、Laravel認証クラスを直接使用しユーザーの認証を管理する必要があります。心配ありません。それでも簡単です!Note that you are not required to use the authentication controllers included with Laravel. If you choose to remove these controllers, you will need to manage user authentication using the Laravel authentication classes directly. Don't worry, it's a cinch!
Laravelの認証サービスにはAuth
ファサードでアクセスできます。クラスの最初でAuth
ファサードを確実にインポートしておきましょう。次にattempt
メソッドを見てみましょう。We will access Laravel's authentication services via the Auth
facade[/docs/{{version}}/facades], so we'll need to make sure to import the Auth
facade at the top of the class. Next, let's check out the attempt
method:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
/**
* 認証を処理する
*
* @param \Illuminate\Http\Request $request
*
* @return Response
*/
public function authenticate(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
// 認証に成功した
return redirect()->intended('dashboard');
}
}
}
attempt
メソッドは最初の引数として、キー/値ペアの配列を受け取ります。配列中の他の値は、データベーステーブルの中からそのユーザーを見つけるために使用されます。そのため、上の例ではemail
カラム値によりユーザーが取得されます。データベース中のハッシュ済みパスワードと比較する前に、フレームワークは自動的に値をハッシュ化するため、password
へ指定する値はハッシュ化しないでください。2つのハッシュ済みパスワードが一致したら、そのユーザーの新しい認証セッションが開始されます。The attempt
method accepts an array of key / value pairs as its first argument. The values in the array will be used to find the user in your database table. So, in the example above, the user will be retrieved by the value of the email
column. If the user is found, the hashed password stored in the database will be compared with the password
value passed to the method via the array. You should not hash the password specified as the password
value, since the framework will automatically hash the value before comparing it to the hashed password in the database. If the two hashed passwords match an authenticated session will be started for the user.
attempt
メソッドは、認証が成功すればtrue
を返します。失敗時はfalse
を返します。The attempt
method will return true
if authentication was successful. Otherwise, false
will be returned.
リダイレクタのintended
メソッドは、認証フィルターで引っかかる前にアクセスしようとしていたURLへ、ユーザーをリダイレクトしてくれます。そのリダイレクトが不可能な場合の移動先として、フォールバックURIをこのメソッドに指定してください。The intended
method on the redirector will redirect the user to the URL they were attempting to access before being intercepted by the authentication middleware. A fallback URI may be given to this method in case the intended destination is not available.
追加条件の指定Specifying Additional Conditions
お望みであれば、ユーザーのメールアドレスとパスワードに付け加え、認証時のクエリに追加の条件を指定することも可能です。例として、ユーザーが「アクティブ」である条件を追加してみましょう。If you wish, you may also add extra conditions to the authentication query in addition to the user's e-mail and password. For example, we may verify that user is marked as "active":
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// ユーザーは存在しており、かつアクティブで、資格停止されていない
}
Note:
この例のように、
特定のGuardインスタンスへのアクセスAccessing Specific Guard Instances
Auth
ファサードのguard
メソッドにより、使用したいガードインスタンスを指定できます。これによりまったく異なった認証用のモデルやユーザーテーブルを使い、アプリケーションの別々の部分に対する認証が管理できます。You may specify which guard instance you would like to utilize using the guard
method on the Auth
facade. This allows you to manage authentication for separate parts of your application using entirely separate authenticatable models or user tables.
guard
メソッドへ渡すガード名は、auth.php
認証ファイルのguards設定の一つと対応している必要があります。The guard name passed to the guard
method should correspond to one of the guards configured in your auth.php
configuration file:
if (Auth::guard('admin')->attempt($credentials)) {
//
}
ログアウトLogging Out
アプリケーションからユーザーをログアウトさせるには、Auth
ファサードのlogout
メソッドを使用してください。これはユーザーセッションの認証情報をクリアします。To log users out of your application, you may use the logout
method on the Auth
facade. This will clear the authentication information in the user's session:
Auth::logout();
継続ログインRemembering Users
アプリケーションでログイン維持(Remember me)機能を持たせたい場合は、attempt
メソッドの第2引数に論理値を指定します。ユーザーが自分でログアウトしない限り、認証を無期限に保持します。"remember me"トークンを保存するために使用する文字列のremember_token
カラムをusers
テーブルに持たせる必要があります。If you would like to provide "remember me" functionality in your application, you may pass a boolean value as the second argument to the attempt
method, which will keep the user authenticated indefinitely, or until they manually logout. Your users
table must include the string remember_token
column, which will be used to store the "remember me" token.
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// このメンバーは継続ログインされる
}
">Tip!! Laravelに用意されている、組み込み
LoginController
を使用する場合、このコントローラが使用しているトレイトにより、"remember"ユーザーを確実に処理するロジックが実装済みです。{tip} If you are using the built-inLoginController
that is shipped with Laravel, the proper logic to "remember" users is already implemented by the traits used by the controller.
この機能を使用している時に、ユーザーが"remember me"クッキーを使用して認証されているかを判定するには、viaRemember
メソッドを使用します。If you are "remembering" users, you may use the viaRemember
method to determine if the user was authenticated using the "remember me" cookie:
if (Auth::viaRemember()) {
//
}
他の認証方法Other Authentication Methods
Userインスタンスによる認証Authenticate A User Instance
すでに存在しているユーザーインスタンスでアプリケーションにログインさせる必要があれば、login
メソッドにそのユーザーインスタンスを指定し呼び出してください。指定されたオブジェクトはIlluminate\Contracts\Auth\Authenticatable
契約を実装している必要があります。Laravelが用意しているApp\User
モデルはこのインターフェイスを実装しています。If you need to log an existing user instance into your application, you may call the login
method with the user instance. The given object must be an implementation of the Illuminate\Contracts\Auth\Authenticatable
contract[/docs/{{version}}/contracts]. The App\User
model included with Laravel already implements this interface:
Auth::login($user);
// 指定したユーザーでログインし、"remember"にする
Auth::login($user, true);
使用したいガードインスタンスを指定することもできます。You may specify the guard instance you would like to use:
Auth::guard('admin')->login($user);
IDによるユーザー認証Authenticate A User By ID
ユーザーをアプリケーションへIDによりログインさせる場合は、loginUsingId
メソッドを使います。このメソッドは認証させたいユーザーの主キーを引数に受け取ります。To log a user into the application by their ID, you may use the loginUsingId
method. This method accepts the primary key of the user you wish to authenticate:
Auth::loginUsingId(1);
// 指定したユーザーでログインし、"remember"にする
Auth::loginUsingId(1, true);
ユーザーを一度だけ認証するAuthenticate A User Once
once
メソッドを使用すると、アプリケーションにユーザーをそのリクエストの間だけログインさせることができます。セッションもクッキーも使用しないため、ステートレスなAPIを構築する場合に便利です。You may use the once
method to log a user into the application for a single request. No sessions or cookies will be utilized, which means this method may be helpful when building a stateless API:
if (Auth::once($credentials)) {
//
}
HTTP基本認証HTTP Basic Authentication
HTTP基本認証により、専用の「ログイン」ページを用意しなくても手っ取り早くアプリケーションにユーザーをログインさせられます。これを使用するには、ルートにauth.basic
ミドルウェアを付けてください。auth.basic
ミドルウェアはLaravelフレームワークに含まれているので、定義する必要はありません。HTTP Basic Authentication[https://en.wikipedia.org/wiki/Basic_access_authentication] provides a quick way to authenticate users of your application without setting up a dedicated "login" page. To get started, attach the auth.basic
middleware[/docs/{{version}}/middleware] to your route. The auth.basic
middleware is included with the Laravel framework, so you do not need to define it:
Route::get('profile', function() {
// 認証済みのユーザーのみが入れる
})->middleware('auth.basic');
ミドルウェアをルートに指定すれば、ブラウザーからこのルートへアクセスされると自動的に認証が求められます。デフォルトでは、auth.basic
ミドルウェアはユーザーを決める"username"としてユーザーのemail
カラムを使用します。Once the middleware has been attached to the route, you will automatically be prompted for credentials when accessing the route in your browser. By default, the auth.basic
middleware will use the email
column on the user record as the "username".
FastCGIの注意A Note On FastCGI
PHP FastCGIを使用している場合、初期状態のままでHTTP基本認証は正しく動作しないでしょう。以下の行を.htaccess
ファイルへ追加してください。If you are using PHP FastCGI, HTTP Basic authentication may not work correctly out of the box. The following lines should be added to your .htaccess
file:
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
ステートレスなHTTP基本認証Stateless HTTP Basic Authentication
セッションの識別クッキーを用いずにHTTP基本認証を使用することもできます。これはとくにAPI認証に便利です。実装するには、onceBasic
メソッドを呼び出すミドルウェアを定義してください。onceBasic
メソッドが何もレスポンスを返さなかった場合、リクエストをアプリケーションの先の処理へ通します。You may also use HTTP Basic Authentication without setting a user identifier cookie in the session, which is particularly useful for API authentication. To do so, define a middleware[/docs/{{version}}/middleware] that calls the onceBasic
method. If no response is returned by the onceBasic
method, the request may be passed further into the application:
<?php
namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;
class AuthenticateOnceWithBasicAuth
{
/**
* 送信されたリクエストの処理
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, $next)
{
return Auth::onceBasic() ?: $next($request);
}
}
次にルートミドルウェアを登録し、ルートに付加します。Next, register the route middleware[/docs/{{version}}/middleware#registering-middleware] and attach it to a route:
Route::get('api/user', function() {
// 認証済みのユーザーのみが入れる
})->middleware('auth.basic.once');
ログアウトLogging Out
アプリケーションからユーザーをログアウトさせる場合、Auth
ファサードのlogout
メソッドを使用してください。これにより、ユーザーセッションの認証情報はクリアされます。To manually log users out of your application, you may use the logout
method on the Auth
facade. This will clear the authentication information in the user's session:
use Illuminate\Support\Facades\Auth;
Auth::logout();
他のデバイス上のセッションを無効化Invalidating Sessions On Other Devices
さらにLaravelは現在のユーザーの現在のデバイス上のセッションを無効化せずに、他のデバイス上のセッションを無効化し、「ログアウト」させるメカニズムを提供しています。通常この機能は、ユーザーがパスワードを変更した場合に現在のデバイスの認証を保持したまま、他のデバイスのセッションを切断したいときに便利でしょう。Laravel also provides a mechanism for invalidating and "logging out" a user's sessions that are active on other devices without invalidating the session on their current device. This feature is typically utilized when a user is changing or updating their password and you would like to invalidate sessions on other devices while keeping the current device authenticated.
これを使用するには、app/Http/Kernel.php
クラスのweb
ミドルウェアグループ中に、Illuminate\Session\Middleware\AuthenticateSession
ミドルウェアが存在し、コメントを確実に外してください。Before getting started, you should make sure that the Illuminate\Session\Middleware\AuthenticateSession
middleware is present and un-commented in your app/Http/Kernel.php
class' web
middleware group:
'web' => [
// ...
\Illuminate\Session\Middleware\AuthenticateSession::class,
// ...
],
それから、Auth
ファサードのlogoutOtherDevices
メソッドを使用してください。このメソッドは、入力フォームからアプリケーションが受け取る、現在のパスワードを引数に渡す必要があります。Then, you may use the logoutOtherDevices
method on the Auth
facade. This method requires the user to provide their current password, which your application should accept through an input form:
use Illuminate\Support\Facades\Auth;
Auth::logoutOtherDevices($password);
logoutOtherDevices
メソッドが起動すると、ユーザーの他のセッションはすべて無効になります。つまり、以前に認証済みのすべてのガードが「ログアウト」されます。When the logoutOtherDevices
method is invoked, the user's other sessions will be invalidated entirely, meaning they will be "logged out" of all guards they were previously authenticated by.
Note:
login
ルートに対するルート名をカスタマイズしながら、AuthenticateSession
ミドルウェアを使用している場合は、アプリケーションの例外ハンドラにあるunauthenticated
メソッドをオーバーライドし、ログインページへユーザーを確実にリダイレクトしてください。{note} When using theAuthenticateSession
middleware in combination with a custom route name for thelogin
route, you must override theunauthenticated
method on your application's exception handler to properly redirect users to your login page.
カスタムガードの追加Adding Custom Guards
独自の認証ガードはAuth
ファサードのextend
メソッドを使用し、定義します。サービスプロバイダの中で呼び出します。AuthServiceProvider
をLaravelはあらかじめ用意しているので、この中にコードを設置できます。You may define your own authentication guards using the extend
method on the Auth
facade. You should place this call to extend
within a service provider[/docs/{{version}}/providers]. Since Laravel already ships with an AuthServiceProvider
, we can place the code in that provider:
<?php
namespace App\Providers;
use App\Services\Auth\JwtGuard;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;
class AuthServiceProvider extends ServiceProvider
{
/**
* サービスの初期起動後の登録実行
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Auth::extend('jwt', function($app, $name, array $config) {
// Illuminate\Contracts\Auth\Guardのインスタンスを返す
return new JwtGuard(Auth::createUserProvider($config['provider']));
});
}
}
上記の例のように、コールバックをextend
メソッドに渡し、Illuminate\Contracts\Auth\Guard
の実装を返します。このインスタンスは、カスタムガードで定義が必要ないくつかのメソッドを持っています。カスタムガードを定義したら、auth.php
設定ファイルの、guards
設定で使用できます。As you can see in the example above, the callback passed to the extend
method should return an implementation of Illuminate\Contracts\Auth\Guard
. This interface contains a few methods you will need to implement to define a custom guard. Once your custom guard has been defined, you may use this guard in the guards
configuration of your auth.php
configuration file:
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
クロージャリクエストガードClosure Request Guards
HTTPリクエストをベースとした、カスタム認証システムを実装する一番簡単な方法は、Auth::viaRequest
メソッドを使用する方法です。このメソッドは一つのクロージャの中で、認証プロセスを素早く定義できるように用意しています。The simplest way to implement a custom, HTTP request based authentication system is by using the Auth::viaRequest
method. This method allows you to quickly define your authentication process using a single Closure.
利用するにはAuthServiceProvider
のboot
メソッドの中から、Auth::viaRequest
メソッドを呼び出してください。viaRequest
メソッドの最初の引数は、認証ドライバ名です。名前にはカスタムガードを表す文字列を何でも使用できます。メソッド2つ目の引数は、受信したHTTPリクエストを受け取り、ユーザーインスタンスか認証失敗時のnull
を返すクロージャを指定します。To get started, call the Auth::viaRequest
method within the boot
method of your AuthServiceProvider
. The viaRequest
method accepts an authentication driver name as its first argument. This name can be any string that describes your custom guard. The second argument passed to the method should be a Closure that receives the incoming HTTP request and returns a user instance or, if authentication fails, null
:
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
/**
* 全認証/認可サービスの登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Auth::viaRequest('custom-token', function ($request) {
return User::where('token', $request->token)->first();
});
}
カスタム認証ドライバーを定義したら、auth.php
設定ファイルのguards
設定で、そのドライバを利用します。Once your custom authentication driver has been defined, you use it as a driver within guards
configuration of your auth.php
configuration file:
'guards' => [
'api' => [
'driver' => 'custom-token',
],
],
カスタムユーザープロバイダの追加Adding Custom User Providers
ユーザー情報を保管するために伝統的なリレーショナルデータベースを使用したくなければ、Laravelに独自の認証ユーザープロバイダを拡張する必要があります。Auth
ファサードのprovider
メソッドを使い、カスタムユーザープロバイダを定義します。If you are not using a traditional relational database to store your users, you will need to extend Laravel with your own authentication user provider. We will use the provider
method on the Auth
facade to define a custom user provider:
<?php
namespace App\Providers;
use App\Extensions\RiakUserProvider;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;
class AuthServiceProvider extends ServiceProvider
{
/**
* サービスの初期起動後の登録実行
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Auth::provider('riak', function($app, array $config) {
// Illuminate\Contracts\Auth\UserProviderのインスタンスを返す
return new RiakUserProvider($app->make('riak.connection'));
});
}
}
provider
メソッドでプロバイダを登録したら、auth.php
設定ファイルで新しいユーザープロバイダへ切り替えます。最初に、新しいドライバを使用するprovider
を定義します。After you have registered the provider using the provider
method, you may switch to the new user provider in your auth.php
configuration file. First, define a provider
that uses your new driver:
'providers' => [
'users' => [
'driver' => 'riak',
],
],
次に、このプロバイダをguards
設定項目で利用します。Finally, you may use this provider in your guards
configuration:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
ユーザープロバイダ契約The User Provider Contract
Illuminate\Contracts\Auth\UserProvider
は、MySQLやRiakなどのような持続性のストレージシステムに対するIlluminate\Contracts\Auth\Authenticatable
の実装を取得することだけに責任を持っています。これらの2つのインターフェイスはユーザーデータがどのように保存されているか、それを表すのがどんなタイプのクラスなのかにかかわらず、認証メカニズムを機能し続けるために役立っています。The Illuminate\Contracts\Auth\UserProvider
implementations are only responsible for fetching a Illuminate\Contracts\Auth\Authenticatable
implementation out of a persistent storage system, such as MySQL, Riak, etc. These two interfaces allow the Laravel authentication mechanisms to continue functioning regardless of how the user data is stored or what type of class is used to represent it.
Illuminate\Contracts\Auth\UserProvider
契約を見てみましょう。Let's take a look at the Illuminate\Contracts\Auth\UserProvider
contract:
<?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
実装が取得され、返されます。The retrieveById
function typically receives a key representing the user, such as an auto-incrementing ID from a MySQL database. The Authenticatable
implementation matching the ID should be retrieved and returned by the method.
retrieveByToken
関数は、一意の$identifier
とremember_token
フィールドに保存されている"remember me" $token
からユーザーを取得します。前のメソッドと同じく、Authenticatable
実装が返されます。The retrieveByToken
function retrieves a user by their unique $identifier
and "remember me" $token
, stored in a field remember_token
. As with the previous method, the Authenticatable
implementation should be returned.
updateRememberToken
メソッドは、$user
のremember_token
フィールドを新しい$token
で更新します。真新しいトークンは、"remember me"ログインの試みに成功するか、そのユーザーがログアウトしたときにアサインされます。The updateRememberToken
method updates the $user
field remember_token
with the new $token
. A fresh token is assigned on a successful "remember me" login attempt or when the user is logging out.
retrieveByCredentials
メソッドはアプリケーションへのログイン時に、Auth::attempt
メソッドに指定するのと同じユーザー認証情報の配列を引数に取ります。メソッドは裏で動作する持続ストレージにより、認証情報に一致するユーザーを「クエリ」する必要があります。典型的な使用法の場合、このメソッドは$credentials['username']
の"where"条件でクエリを実行するでしょう。メソッドはAuthenticatable
の実装を返します。このメソッドはパスワードバリデーションや認証を行ってはいけませんThe retrieveByCredentials
method receives the array of credentials passed to the Auth::attempt
method when attempting to sign into an application. The method should then "query" the underlying persistent storage for the user matching those credentials. Typically, this method will run a query with a "where" condition on $credentials['username']
. The method should then return an implementation of Authenticatable
. This method should not attempt to do any password validation or authentication.
validateCredentials
メソッドは指定された$user
と、そのユーザーを認証するための$credentials
とを比較します。たとえば、このメソッドで$user->getAuthPassword()
の値と$credentials['password']
をHash::check
により値を比較します。このメソッドは、パスワードが有効であるかを示すtrue
かfalse
だけを返します。The validateCredentials
method should compare the given $user
with the $credentials
to authenticate the user. For example, this method should probably use Hash::check
to compare the value of $user->getAuthPassword()
to the value of $credentials['password']
. This method should return true
or false
indicating on whether the password is valid.
Authenticatable契約The Authenticatable Contract
これでUserProvider
の各メソッドが明らかになりました。続いてAuthenticatable
契約を見てみましょう。プロバイダはretrieveById
とretrieveByToken
、retrieveByCredentials
メソッドでこのインターフェイスの実装を返していたことを思い出してください。Now that we have explored each of the methods on the UserProvider
, let's take a look at the Authenticatable
contract. Remember, the provider should return implementations of this interface from the retrieveById
, retrieveByToken
, and retrieveByCredentials
methods:
<?php
namespace Illuminate\Contracts\Auth;
interface Authenticatable
{
public function getAuthIdentifierName();
public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
このインターフェイスはシンプルです。getAuthIdentifierName
メソッドは、ユーザーの「主キー」フィールドの名前を返します。getAuthIdentifier
メソッドはユーザーの主キーを返します。MySQLを裏で使用している場合、これは自動増分される主キーでしょう。getAuthPassword
はユーザーのハッシュ済みのパスワードを返します。このインターフェイスはどのORMや抽象ストレージ層を使用しているかにかかわらず、どんなUserクラスに対しても認証システムが動作するようにしてくれています。デフォルトでLaravelはapp
ディレクトリ中に、このインターフェイスを実装してるUser
クラスを持っています。ですから実装例として、このクラスを調べてみてください。This interface is simple. The getAuthIdentifierName
method should return the name of the "primary key" field of the user and the getAuthIdentifier
method should return the "primary key" of the user. In a MySQL back-end, again, this would be the auto-incrementing primary key. The getAuthPassword
should return the user's hashed password. This interface allows the authentication system to work with any User class, regardless of what ORM or storage abstraction layer you are using. By default, Laravel includes a User
class in the app
directory which implements this interface, so you may consult this class for an implementation example.
イベントEvents
Laravelは認証処理の過程で、さまざまなイベントを発行します。EventServiceProvider
の中で、こうしたイベントに対するリスナを設定できます。:Laravel raises a variety of events[/docs/{{version}}/events] during the authentication process. You may attach listeners to these events in your EventServiceProvider
:
/**
* アプリケーションに指定されたイベントリスナ
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Registered' => [
'App\Listeners\LogRegisteredUser',
],
'Illuminate\Auth\Events\Attempting' => [
'App\Listeners\LogAuthenticationAttempt',
],
'Illuminate\Auth\Events\Authenticated' => [
'App\Listeners\LogAuthenticated',
],
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
'Illuminate\Auth\Events\Failed' => [
'App\Listeners\LogFailedLogin',
],
'Illuminate\Auth\Events\Validated' => [
'App\Listeners\LogValidated',
],
'Illuminate\Auth\Events\Verified' => [
'App\Listeners\LogVerified',
],
'Illuminate\Auth\Events\Logout' => [
'App\Listeners\LogSuccessfulLogout',
],
'Illuminate\Auth\Events\CurrentDeviceLogout' => [
'App\Listeners\LogCurrentDeviceLogout',
],
'Illuminate\Auth\Events\OtherDeviceLogout' => [
'App\Listeners\LogOtherDeviceLogout',
],
'Illuminate\Auth\Events\Lockout' => [
'App\Listeners\LogLockout',
],
'Illuminate\Auth\Events\PasswordReset' => [
'App\Listeners\LogPasswordReset',
],
];