イントロダクションIntroduction
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はデフォルトとして、app
ディレクトリーの中の、App/User
モデルを読み込みます。このモデルはデフォルトのEloquent認証ドライバーと共に使用されます。By default, Laravel includes an App\User
model in your app
directory. This model may be used with the default Eloquent authentication driver.
重要: このモデルのデータベーススキーマを定義するとき、パスワード(password
)カラムは最低でも60文字にしてください。また使用する前に、空文字列を許し(NULLABLE)100文字の文字列のremember_token
カラムをusers
(もしくは同様の)テーブルへ確実に定義してください。マイグレーション中に$table->rememberToken();
を使い定義すれば、このカラムが設定されます。もちろん、Laravel5には、これらのカラムのためのマイグレーションを最初から用意してあります!Remember: when building the database schema for this model, make the password column at least 60 characters. Also, before getting started, make sure 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 "remember me" sessions being maintained by your application. This can be done by using $table->rememberToken();
in a migration. Of course, Laravel 5 ships migrations for these columns out of the box!
アプリケーションでEloquentを使用しない場合は、Laravelクエリービルダーを使用する、database
ドライバーを使用してください。If your application is not using Eloquent, you may use the database
authentication driver which uses the Laravel query builder.
ユーザー認証Authenticating Users
Laravelでは認証に関連する2つのコントローラーが用意されています。AuthController
は、新ユーザーの登録と、「ログイン」を処理します。もうひとつのPasswordController
には、登録済みユーザーがパスワードを忘れた時にリセットするためのロジックが準備されています。Laravel ships with two authentication related controllers out of the box. The AuthController
handles new user registration and "logging in", while the PasswordController
contains the logic to help existing users reset their forgotten passwords.
必要なメソッドを読み込むために、両方のコントローラーでトレイトが使われています。多くのアプリケーションで、これらのコントローラーを変更する必要は全く無いでしょう。これらのコントローラーが表示するビューは、resources/views/auth
ディレクトリーにあります。こちらはお望み通り、自由に変更してください。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. The views that these controllers render are located in the resources/views/auth
directory. You are free to customize these views however you wish.
ユーザ登録The User Registrar
アプリケーションに新しいユーザーを登録するときに利用する、フォームのフィールドを変更するためには、App\Services\Registrar
クラスを変更してください。このクラスは、バリデーションとアプリケーションの新ユーザーを作成することに責任を持っています。To modify the form fields that are required when a new user registers with your application, you may modify the App\Services\Registrar
class. This class is responsible for validating and creating new users of your application.
Registrar
のvalidator
メソッドは、アプリケーションの新ユーザーに対する、バリデーションルールで構成されています。一方で、Registrar
のcreate
メソッドは、データベースに新しいUser
レコードを作成することに責任を持っています。両メソッドとも、お好きなように変更してかまいません。Registrar
はAuthController
により、AuthenticatesAndRegistersUsers
トレイトの中のメソッドを通じて呼びだされます。The validator
method of the Registrar
contains the validation rules for new users of the application, while the create
method of the Registrar
is responsible for creating new User
records in your database. You are free to modify each of these methods as you wish. The Registrar
is called by the AuthController
via the methods contained in the AuthenticatesAndRegistersUsers
trait.
手動認証Manual Authentication
提供しているAuthController
実装を使用しない選択をする場合は、Laravel認証クラスを直接使用し、ユーザーの認証を管理する必要があります。心配ありません。それでも、簡単ですよ!attempt
メソッドを最初に見てみましょう。If you choose not to use the provided AuthController
implementation, you will need to manage the authentication of your users using the Laravel authentication classes directly. Don't worry, it's still a cinch! First, let's check out the attempt
method:
<?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
メソッドは最初の引数として、キー/値ペアの配列を受け取ります。password
値はハッシュされている必要があります。配列中の他の値は、データベーステーブルの中から、そのユーザーを見つけるために使用されます。ですから、上の例ではemail
カラムの値により、ユーザーが取得されます。ユーザーが見つかれば、配列でメソッドに渡されたハッシュ済みのpassword
値と、データベースに保存してあったハッシュ済みpassword
が比較されます。2つのハッシュ済みパスワードが一致したら、そのユーザーの新しい認証セッションが開始されます。The attempt
method accepts an array of key / value pairs as its first argument. The password
value will be hashed[/docs/{{version}}/hashing]. The other 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 hashed password
value passed to the method via the array. If the two hashed passwords match, a new 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
redirect function will redirect the user to the URL they were attempting to access before being caught by the authentication filter. A fallback URI may be given to this method in case the intended destination is not available.
条件付きユーザー認証Authenticating A User With Conditions
認証時のクエリーに、追加の条件を指定することも可能です。You also may add extra conditions to the authentication query:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
{
// ユーザーは存在し、アクティブになっている
}
ユーザー認証済みの判定Determining If A User Is Authenticated
ユーザーがアプリケーションにログインしているかを判断するには、check
メソッドを使用してください。To determine if the user is already logged into your application, you may use the check
method:
if (Auth::check())
{
// ユーザーはログイン済み…
}
ユーザー認証とログインの持続Authenticating A User And "Remembering" Them
アプリケーションでログイン維持(Remember me)機能を持たせたい場合は、attempt
メソッドの第2引数に論理値でtrue
を指定します。ユーザーが自分でログアウトしない限り、認証が持続するようになります。もちろん、"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. Of course, 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))
{
// $rememberがtrueであれば、このユーザーは覚えられた…
}
この機能を使用している時に、ユーザーが、"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())
{
//
}
IDによるユーザー認証Authenticating Users By ID
ユーザーをアプリケーションへ、IDによりログインさせる場合は、loginUsingId
メソッドを使います。To log a user into the application by their ID, use the loginUsingId
method:
Auth::loginUsingId(1);
ログインさせずに認証データー確認Validating User Credentials Without Login
アプリケーションにユーザーを実際にログインさせずに、認証データーを確認だけしたい場合は、validate
メソッドを使用してください。The validate
method allows you to validate a user's credentials without actually logging them into the application:
if (Auth::validate($credentials))
{
//
}
リクエスト1回のみのユーザーログインLogging A User In For A Single Request
once
メソッドを使用すると、アプリケーションにユーザーをそのリクエストの間だけログインさせることができます。セッションもクッキーも使用されません。You may also use the once
method to log a user into the application for a single request. No sessions or cookies will be utilized:
if (Auth::once($credentials))
{
//
}
ユーザーの手動ログインManually Logging In A User
アプリケーションに、既に存在するユーザーインスタンスを用いてログインさせる必要がある場合、login
メソッドへ渡し、呼び出してください。If you need to log an existing user instance into your application, you may call the login
method with the user instance:
Auth::login($user);
これは認証データーを使用し、attempt
メソッドでログインした場合と同じように動作します。This is equivalent to logging in a user via credentials using the attempt
method.
アプリケーションからのログアウトLogging A User Out Of The Application
Auth::logout();
もちろん、組み込み済みのLaravel認証コントローラーを使用しているのでしたら、ユーザーをアプリケーションからログアウトさせるためのコントローラーメソッドは、最初から用意してあります。Of course, if you are using the built-in Laravel authentication controllers, a controller method that handles logging users out of the application is provided out of the box.
認証イベントAuthentication Events
attempt
メソッドが呼び出されると、auth.attempt
イベントが発行されます。認証が成功し、ユーザーがログインすると、auth.login
イベントが同様に発行されます。When the attempt
method is called, the auth.attempt
event[/docs/{{version}}/events] will be fired. If the authentication attempt is successful and the user is logged in, the auth.login
event will be fired as well.
認証済みユーザー情報の取得Retrieving The Authenticated User
一度ユーザーが認証されると、そのユーザーのインスタンスを取得する様々な方法が利用できます。Once a user is authenticated, there are several ways to obtain an instance of the User.
最初に、Auth
ファサードによりユーザーにアクセスしてみましょう。First, you may access the user from the Auth
facade:
<?php namespace App\Http\Controllers;
use Auth;
use Illuminate\Routing\Controller;
class ProfileController extends Controller {
/**
* ユーザープロファイルの更新
*
* @return Response
*/
public function updateProfile()
{
if (Auth::user())
{
// Auth::user()で認証済みユーザーのインスタンスが返される…
}
}
}
2つ目に、Illuminate\Http\Request
を利用して、認証済みユーザーへアクセスしてみましょう。Second, you may access the authenticated user via an Illuminate\Http\Request
instance:
<?php namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class ProfileController extends Controller {
/**
* ユーザープロファイルの更新
*
* @return Response
*/
public function updateProfile(Request $request)
{
if ($request->user())
{
// $request->user()は認証済みのユーザーインスタンスを返す
}
}
}
3つ目は、Illuminate\Contracts\Auth\Authenticatable
契約のタイプヒントを使用します。このタイプヒントはコントローラーのコンストラクターかコントローラーメソッド、もしくはサービスコンテナにより依存解決されるクラスのコンストラクターで指定します。Thirdly, you may type-hint the Illuminate\Contracts\Auth\Authenticatable
contract. This type-hint may be added to a controller constructor, controller method, or any other constructor of a class resolved by the service container[/docs/{{version}}/container]:
<?php namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use Illuminate\Contracts\Auth\Authenticatable;
class ProfileController extends Controller {
/**
* ユーザープロファイルの更新
*
* @return Response
*/
public function updateProfile(Authenticatable $user)
{
// $userは認証済みユーザーのインスタンス
}
}
ルート保護Protecting Routes
ルートミドルウェアにより、認証済みユーザーだけが指定したルートへのアクセスを行えるようにできます。Laravelはデフォルトで、auth
ミドルウェアを提供しており、app\Http\Middleware\Authenticate.php
の中で定義されています。皆さんが必要なのは、これをルート定義で指定することだけです。Route middleware[/docs/{{version}}/middleware] can be used to allow only authenticated users to access a given route. Laravel provides the auth
middleware by default, and it is defined in app\Http\Middleware\Authenticate.php
. All you need to do is attach it to a route definition:
// ルートクロージャー使用の場合
Route::get('profile', ['middleware' => 'auth', function()
{
// 認証済みユーザーのみが入れる
}]);
// コントローラー使用の場合
Route::get('profile', ['middleware' => 'auth', 'uses' => 'ProfileController@show']);
HTTP基本認証HTTP Basic Authentication
HTTP基本認証により、専用の「ログイン」ページを用意しなくても、素早くアプリケーションにユーザーをログインさせられます。これを使用するには、ルートにauth.basic
ミドルウェアを付けてください。HTTP Basic 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 to your route:
HTTP基本認証によるルート保護Protecting A Route With HTTP Basic
Route::get('profile', ['middleware' => 'auth.basic', function()
{
// 認証済みユーザーのみが入れる
}]);
basic
フィルターはユーザー識別に、レコードのemail
カラムをデフォルトで使用します。By default, the basic
middleware will use the email
column on the user record as the "username".
ステートレスなHTTP基本フィルターSetting Up A Stateless HTTP Basic Filter
セッションの識別クッキーを用いずに、HTTP基本認証を使用することもできます。これは特にAPI認証に便利です。実装するには、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:
public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request);
}
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}]
パスワードリマインダーとリセットPassword Reminders & Reset
モデルとテーブルModel & Table
ほとんどのWebアプリケーションは、パスワードを忘れた場合にリセットする機能をユーザーへ提供しています。アプリケーションを構築するたびごとに、何度も実装しなくても済むように、Laravelはパスワードリマインダーを送信し、パスワードをリセットするための便利な手法を提供しています。Most web applications provide a way for users to reset their forgotten passwords. Rather than forcing you to re-implement this on each application, Laravel provides convenient methods for sending password reminders and performing password resets.
これを利用するには、User
モデルがIlluminate\Contracts\Auth\CanResetPassword
契約を実装しているか確認してください。もちろん、フレームワークに用意されているUser
モデルでは、既にこのインターフェイスが実装されています。Illuminate\Auth\Passwords\CanResetPassword
トレイトで、このインターフェイスで実装する必要のあるメソッドが定義されています。To get started, verify that your User
model implements the Illuminate\Contracts\Auth\CanResetPassword
contract. Of course, the User
model included with the framework already implements this interface, and uses the Illuminate\Auth\Passwords\CanResetPassword
trait to include the methods needed to implement the interface.
リマインダーテーブルマイグレーションの生成Generating The Reminder Table Migration
次に、パスワードリセットトークンを保存しておくためのテーブルを作成します。このテーブルのマイグレーションは、最初からLaravelのdatabase/migrations
ディレクトリーに含まれています。ですから、マイグレートするために必要なのは、次のコマンドだけです。Next, a table must be created to store the password reset tokens. The migration for this table is included with Laravel out of the box, and resides in the database/migrations
directory. So all you need to do is migrate:
php artisan migrate
パスワードリマインダーコントローラーPassword Reminder Controller
Laravelには、ユーザーのパスワードをリセットするために必要なロジックで構成されたAuth\PasswordController
も備わっています。簡単に初められるように、ビューも用意しています!ビューはresources/views/auth
ディレクトリーにあります。アプリケーションのデザインに合わせ、思いのまま自由に変更してください。Laravel also includes an Auth\PasswordController
that contains the logic necessary to reset user passwords. We've even provided views to get you started! The views are located in the resources/views/auth
directory. You are free to modify these views as you wish to suit your own application's design.
PasswordController
のgetReset
メソッドへ張ったリンクをクリックすると、ユーザーはメールを受信することになります。このメソッドはパスワードリセットフォームを表示し、ユーザーがパスワードをリセットできるようにします。パスワードがリセットされると、そのユーザーは自動的にアプリケーションにログインされ、/home
へリダイレクトされます。リセット後のリダイレクト先をカスタマイズするには、PasswordController
のredirectTo
プロパティを定義してください。Your user will receive an e-mail with a link that points to the getReset
method of the PasswordController
. This method will render the password reset form and allow users to reset their passwords. After the password is reset, the user will automatically be logged into the application and redirected to /home
. You can customize the post-reset redirect location by defining a redirectTo
property on the PasswordController
:
protected $redirectTo = '/dashboard';
注意: パスワードリセットトークンの有効時間は、デフォルトで1時間です。
config/auth.php
ファイルの中の、reminder.expire
オプションで変更できます。Note: By default, password reset tokens expire after one hour. You may change this via thereminder.expire
option in yourconfig/auth.php
file.
ソーシャル認証Social Authentication
典型的なフォームを元にした認証に加え、LaravelはLaravel Socialite(ソシエリート:名士)による、OAuthプロバイダーを利用した簡単で便利な認証方法も提供します。Socialiteは現在、Facebook、Twitter、Google、GitHub、Bitbucketをサポートしています。In addition to typical, form based authentication, Laravel also provides a simple, convenient way to authenticate with OAuth providers using Laravel Socialite[https://github.com/laravel/socialite]. Socialite currently supports authentication with Facebook, Twitter, Google, GitHub and Bitbucket.
Socialiteを使用する場合、composer.json
にパッケージを追加してください。To get started with Socialite, include the package in your composer.json
file:
"laravel/socialite": "~2.0"
次に、config/app.php
設定ファイルで、Laravel\Socialite\SocialiteServiceProvider
を登録します。ファサードを追加するのもよいでしょう。Next, register the Laravel\Socialite\SocialiteServiceProvider
in your config/app.php
configuration file. You may also register a facade[/docs/{{version}}/facades]:
'Socialize' => 'Laravel\Socialite\Facades\Socialite',
続いてアプリケーションで使用するOAuthサービスの認証情報を追加する必要があります。認証情報は、config/services.php
設定ファイルで指定します。アプリケーションに必要なプロバイダーにより、facebook
、twitter
、google
、github
のキーを設定してください。You will need to add credentials for the OAuth services your application utilizes. These credentials should be placed in your config/services.php
configuration file, and should use the key facebook
, twitter
, google
, or github
, depending on the providers your application requires. For example:
'github' => [
'client_id' => 'your-github-app-id',
'client_secret' => 'your-github-app-secret',
'redirect' => 'http://your-callback-url',
],
これでユーザーを認証する準備ができました!2つのルートを定義する必要があります。一つはOAuthプロバイダーへユーザーをリダイレクトするルート、もう一つは認証後に、プロバイダーからのコールバックを受け取るルートです。以下の例では、Socialize
ファサードを使用しています。Next, you are ready to authenticate users! You will need two routes: one for redirecting the user to the OAuth provider, and another for receiving the callback from the provider after authentication. Here's an example using the Socialize
facade:
public function redirectToProvider()
{
return Socialize::with('github')->redirect();
}
public function handleProviderCallback()
{
$user = Socialize::with('github')->user();
// $user->token;
}
redirect
メソッドは、ユーザーをOAuthプロバイダーへ送る面倒を見ます。一方のuser
メソッドはリクエストを読み、プロバーダーからのユーザー情報を取得します。ユーザーをリダイレクトする前に、そのリクエストに"scopes"を指定することもできます。The redirect
method takes care of sending the user to the OAuth provider, while the user
method will read the incoming request and retrieve the user's information from the provider. Before redirecting the user, you may also set "scopes" on the request:
return Socialize::with('github')->scopes(['scope1', 'scope2'])->redirect();
ユーザーのインスタンスを取得したら、そのユーザーに関する詳細情報をさらに得られます。Once you have a user instance, you can grab a few more details about the user:
ユーザーの詳細情報取得Retrieving User Details
$user = Socialize::with('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();