イントロダクションIntroduction
Laravelでは古典的なログインフォームによる認証は、簡単に実行できるようになっています。では、APIに関してはどうでしょうか?通常APIでは、ユーザーの認証にトークンを使用し、リクエスト間のセッション状態は保持されません。Laravelアプリケーションのために、完全なOAuth2サーバの実装を提供するLaravel Passportを使えば、短時間で簡単にAPI認証ができます。Passportは、Andy MillingtonとSimon Hampによりメンテナンスされている、League OAuth2サーバ上に構築しています。Laravel already makes it easy to perform authentication via traditional login forms, but what about APIs? APIs typically use tokens to authenticate users and do not maintain session state between requests. Laravel makes API authentication a breeze using Laravel Passport, which provides a full OAuth2 server implementation for your Laravel application in a matter of minutes. Passport is built on top of the League OAuth2 server[https://github.com/thephpleague/oauth2-server] that is maintained by Andy Millington and Simon Hamp.
Note: 用語とOAuth2の機能について予習してください。{note} This documentation assumes you are already familiar with OAuth2. If you do not know anything about OAuth2, consider familiarizing yourself with the general terminology[https://oauth2.thephpleague.com/terminology/] and features of OAuth2 before continuing.
このドキュメントは、皆さんがOAuth2に慣れていることを前提にしています。OAuth2について知らなければ、この先を続けて読む前に、一般的な
PassportのアップグレードUpgrading Passport
Passportの新しいメジャーバーションへアップグレードする場合は、注意深くアップグレードガイドをレビューしてください。When upgrading to a new major version of Passport, it's important that you carefully review the upgrade guide[https://github.com/laravel/passport/blob/master/UPGRADE.md].
インストールInstallation
Composerパッケージマネージャにより、Passportをインストールすることからはじめましょう。To get started, install Passport via the Composer package manager:
composer require laravel/passport
Passportサービスプロバイダはフレームワークに対し、自身のマイグレーションディレクトリを登録します。そのためにパッケージインストール後、データベースのマイグレーションを実行する必要があります。Passportのマイグレーションは、アプリケーションで必要となる、クライアントとアクセストークンを保存しておくテーブルを作成します。The Passport service provider registers its own database migration directory with the framework, so you should migrate your database after installing the package. The Passport migrations will create the tables your application needs to store clients and access tokens:
php artisan migrate
次に、passport:install
コマンドを実行します。このコマンドは安全なアクセストークンを生成するのに必要な暗号キーを作成します。さらにアクセストークンを生成するために使用する、「パーソナルアクセス」クライアントと「パスワードグラント」クライアントも作成します。Next, you should run the passport:install
command. This command will create the encryption keys needed to generate secure access tokens. In addition, the command will create "personal access" and "password grant" clients which will be used to generate access tokens:
php artisan passport:install
">Tip!! 自動増分整数の代わりに、Passportの
Client
モデルの主キー値としてUUIDを使用したい場合は、uuids
オプションを使いPassportをインストールしてください。{tip} If you would like to use UUIDs as the primary key value of the PassportClient
model instead of auto-incrementing integers, please install Passport using theuuids
option[#client-uuids].
passport:install
コマンドを実行し終えたら、Laravel\Passport\HasApiTokens
トレイトをApp\User
モデルへ追加してください。このトレイトは認証済みユーザーのトークンとスコープを調べられるように、モデルへ数個のヘルパメソッドを提供します。After running the passport:install
command, add the Laravel\Passport\HasApiTokens
trait to your App\User
model. This trait will provide a few helper methods to your model which allow you to inspect the authenticated user's token and scopes:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
次に、AuthServiceProvider
のboot
メソッドから、Passport::routes
メソッドを呼び出す必要があります。このメソッドはアクセストークンの発行、アクセストークンの失効、クライアントとパーソナルアクセストークンの管理のルートを登録します。Next, you should call the Passport::routes
method within the boot
method of your AuthServiceProvider
. This method will register the routes necessary to issue access tokens and revoke access tokens, clients, and personal access tokens:
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* アプリケーションのポリシーのマップ
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* 全認証/認可サービスの登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
最後に、config/auth.php
設定ファイル中で、ガードのapi
認証のdriver
オプションをpassport
へ変更します。これにより、認証のAPIリクエストが送信された時に、パスポートのTokenGuard
を使用するように、アプリケーションへ指示します。Finally, in your config/auth.php
configuration file, you should set the driver
option of the api
authentication guard to passport
. This will instruct your application to use Passport's TokenGuard
when authenticating incoming API requests:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
クライアントUUIDClient UUIDs
passport:install
コマンドは--uuids
オプションを指定して実行できます。このフラグはPassportへClient
モデルの主キー値として自動増分整数の代わりにUUIDを使用することを指示します。--uuids
オプションを付けてpassport:install
コマンドを実行したら、Passportのデフォルトマイグレーションの無効化に関して追加の指示が与えられます。You may run the passport:install
command with the --uuids
option present. This flag will instruct Passport that you would like to use UUIDs instead of auto-incrementing integers as the Passport Client
model's primary key values. After running the passport:install
command with the --uuids
option, you will be given additional instructions regarding disabling Passport's default migrations:
php artisan passport:install --uuids
フロントエンド・クイックスタートFrontend Quickstart
Note: Vue JavaScriptフレームワークを使用する必要があります。コンポーネントはBootstrap CSSフレームワークを使用しています。皆さんがこれらのツールを使用しない場合でも、フロントエンド実装の参考として、これらのコンポーネントは役立つでしょう。{note} In order to use the Passport Vue components, you must be using the Vue[https://vuejs.org] JavaScript framework. These components also use the Bootstrap CSS framework. However, even if you are not using these tools, the components serve as a valuable reference for your own frontend implementation.
パスポートVueコンポーネントを使用するには、
パスポートは皆さんのユーザーへ、クライアントとパーソナルアクセストークンを作成するために使用するJSON APIを初めから提供しています。しかし、こうしたAPIに関連するフロントエンドをコーディングするには時間を要します。そこで、Passportは実装例、もしくは実装の開始地点として役立ててもらうため、Vueコンポーネントも用意しています。Passport ships with a JSON API that you may use to allow your users to create clients and personal access tokens. However, it can be time consuming to code a frontend to interact with these APIs. So, Passport also includes pre-built Vue[https://vuejs.org] components you may use as an example implementation or starting point for your own implementation.
Passport Vueコンポーネントをリソース公開するには、vendor:publish
Artisanコマンドを使用します。To publish the Passport Vue components, use the vendor:publish
Artisan command:
php artisan vendor:publish --tag=passport-components
リソース公開されたコンポーネントは、resources/js/components
ディレクトリへ設置されます。リソース公開したコンポーネントは、resources/js/app.js
ファイルで登録してください。The published components will be placed in your resources/js/components
directory. Once the components have been published, you should register them in your resources/js/app.js
file:
Vue.component(
'passport-clients',
require('./components/passport/Clients.vue').default
);
Vue.component(
'passport-authorized-clients',
require('./components/passport/AuthorizedClients.vue').default
);
Vue.component(
'passport-personal-access-tokens',
require('./components/passport/PersonalAccessTokens.vue').default
);
Note:
バージョン5.7.19以前のLaravelでは、コンポーネントを登録する時にコンソールエラーが出る時に、.default
を追加します。この変更については、Laravel Mix v4.0.0リリースノートで説明がなされています。{note} Prior to Laravel v5.7.19, appending.default
when registering components results in a console error. An explanation for this change can be found in the Laravel Mix v4.0.0 release notes[https://github.com/JeffreyWay/laravel-mix/releases/tag/v4.0.0].
コンポーネントを登録したら、アセットを再コンパイルするためnpm run dev
を確実に実行してください。アセットの再コンパイルが済んだら、クライアントとパーソナルアクセストークンを作成し始めるために、アプリケーションのテンプレートへコンポーネントを指定しましょう。After registering the components, make sure to run npm run dev
to recompile your assets. Once you have recompiled your assets, you may drop the components into one of your application's templates to get started creating clients and personal access tokens:
<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>
PassportのデプロイDeploying Passport
Passportを実働サーバへ最初にデプロイするとき、passport:keys
コマンドを実行する必要があるでしょう。このコマンドは、Passportがアクセストークンを生成するために必要な、暗号化キーを生成するコマンドです。生成されたキーは、通常ソースコントロールには含めません。When deploying Passport to your production servers for the first time, you will likely need to run the passport:keys
command. This command generates the encryption keys Passport needs in order to generate access token. The generated keys are not typically kept in source control:
php artisan passport:keys
必要があれば、Passportのキーを読み込むパスを定義できます。Passport::loadKeysFrom
メソッドを使用します。If necessary, you may define the path where Passport's keys should be loaded from. You may use the Passport::loadKeysFrom
method to accomplish this:
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::loadKeysFrom('/secret-keys/oauth');
}
さらに、php artisan vendor:publish --tag=passport-config
により、Passportの設定ファイルをリソース公開することもできます。これにより、環境変数から暗号化キーをロードするためのオプションを提供しています。Additionally, you may publish Passport's configuration file using php artisan vendor:publish --tag=passport-config
, which will then provide the option to load the encryption keys from your environment variables:
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
<private key here>
-----END RSA PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
<public key here>
-----END PUBLIC KEY-----"
マイグレーションのカスタマイズMigration Customization
Passportのデフォルトマイグレーションを使用しない場合、AppServiceProvider
のregister
メソッドでPassport::ignoreMigrations
メソッドを呼び出す必用があります。php artisan vendor:publish --tag=passport-migrations
により、デフォルトマイグレーションをエクスポートできます。If you are not going to use Passport's default migrations, you should call the Passport::ignoreMigrations
method in the register
method of your AppServiceProvider
. You may export the default migrations using php artisan vendor:publish --tag=passport-migrations
.
設定Configuration
クライアントシークレットハッシュClient Secret Hashing
クライアントのシークレットをデータベース保存時にハッシュ化したい場合は、AppServiceProvider
のboot
メソッドでPassport::hashClientSecrets
メソッドを呼び出す必用があります。If you would like your client's secrets to be hashed when stored in your database, you should call the Passport::hashClientSecrets
method in the boot
method of your AppServiceProvider
:
Passport::hashClientSecrets();
一度有効にすると、すべてのクライアントのシークレットはクライアント作成時に一度だけ表示されます。データベースには平文のクライアントシークレット値はまったく保存されないため、失われたら回復は不可能です。Once enabled, all of your client secrets will only be shown one time when your client is created. Since the plain-text client secret value is never stored in the database, it is not possible to recover if lost.
トークン持続時間Token Lifetimes
Passportはデフォルトで、一年間有効な長期間持続するアクセストークンを発行します。トークンの持続時間をもっと短くしたい場合は、tokensExpireIn
とrefreshTokensExpireIn
、personalAccessTokensExpireIn
メソッドを使ってください。これらのメソッドは、AuthServiceProvider
のboot
メソッドから呼び出してください。By default, Passport issues long-lived access tokens that expire after one year. If you would like to configure a longer / shorter token lifetime, you may use the tokensExpireIn
, refreshTokensExpireIn
, and personalAccessTokensExpireIn
methods. These methods should be called from the boot
method of your AuthServiceProvider
:
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
}
Note:
Passportデータベーステーブルのexpires_at
カラムは読み取り専用で、表示目的のみです。トークン発行時にPassportは、署名暗号化されたトークン内へ有効期限情報を格納します。トークンを無効にする必要がある場合は、トークンを取り消す必要があります。{note} Theexpires_at
columns on the Passport database tables are read-only and for display purposes only. When issuing tokens, Passport stores the expiration information within the signed and encrypted tokens. If you need to invalidate a token you should revoke it.
デフォルトモデルのオーバーライドOverriding Default Models
Passportが内部で使用するモデルは自由に拡張できます。You are free to extend the models used internally by Passport:
use Laravel\Passport\Client as PassportClient;
class Client extends PassportClient
{
// ...
}
それから、Passport
クラスを通して、カスタムモデルを指示します。Then, you may instruct Passport to use your custom models via the Passport
class:
use App\Models\Passport\AuthCode;
use App\Models\Passport\Client;
use App\Models\Passport\PersonalAccessClient;
use App\Models\Passport\Token;
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::useTokenModel(Token::class);
Passport::useClientModel(Client::class);
Passport::useAuthCodeModel(AuthCode::class);
Passport::usePersonalAccessClientModel(PersonalAccessClient::class);
}
アクセストークンの発行Issuing Access Tokens
OAuth2で認可コードを使いこなせるかは、どの程度開発者がOAuth2に慣れているかによります。認可コードを使用する時、クライアントアプリケーションはそのクライアントに対するアクセストークン発行のリクエストが許可されようと、拒絶されようと、あなたのサーバにそのユーザーをリダイレクトします。Using OAuth2 with authorization codes is how most developers are familiar with OAuth2. When using authorization codes, a client application will redirect a user to your server where they will either approve or deny the request to issue an access token to the client.
クライアント管理Managing Clients
あなたのアプリケーションのAPIと連携する必要のある、アプリケーションを構築しようとしている開発者たちは、最初に「クライアント」を作成することにより、彼らのアプリケーションを登録しなくてはなりません。通常、アプリケーションの名前と、許可のリクエストをユーザーが承認した後に、アプリケーションがリダイレクトされるURLにより、登録情報は構成されます。First, developers building applications that need to interact with your application's API will need to register their application with yours by creating a "client". Typically, this consists of providing the name of their application and a URL that your application can redirect to after users approve their request for authorization.
passport:client
コマンドThe passport:client
Command
クライアントを作成する一番簡単な方法は、passport:client
Artisanコマンドを使うことです。このコマンドは、OAuth2の機能をテストするため、皆さん自身のクライアントを作成する場合に使用できます。client
コマンドを実行すると、Passportはクライアントに関する情報の入力を促し、クライアントIDとシークレットを表示します。The simplest way to create a client is using the passport:client
Artisan command. This command may be used to create your own clients for testing your OAuth2 functionality. When you run the client
command, Passport will prompt you for more information about your client and will provide you with a client ID and secret:
php artisan passport:client
リダイレクトURLRedirect URLs
クライアントに対するリダイレクトURLを複数許可したければ、passport:client
コマンドで入力を促された時にURLをカンマで区切り指定します。If you would like to allow multiple redirect URLs for your client, you may specify them using a comma-delimited list when prompted for the URL by the passport:client
command:
http://example.com/callback,http://examplefoo.com/callback
Note: {note} Any URL which contains commas must be encoded.
カンマを含んでいるURLは、エンコードしてください。
JSON APIJSON API
皆さんのアプリのユーザーはclient
コマンドを使用できないわけですから、Passportはクライアント作成のJSON APIを提供しています。これにより、クライアントを作成、更新、削除するコントローラをわざわざコードする手間を省略できます。Since your users will not be able to utilize the client
command, Passport provides a JSON API that you may use to create clients. This saves you the trouble of having to manually code controllers for creating, updating, and deleting clients.
しかし、ユーザーにクライアントを管理してもらうダッシュボードを提供するために、PassportのJSON APIと皆さんのフロントエンドを結合する必要があります。以降から、クライアントを管理するためのAPIエンドポイントをすべて説明します。エンドポイントへのHTTPリクエスト作成をデモンストレートするため利便性を考慮し、Axiosを使用していきましょう。However, you will need to pair Passport's JSON API with your own frontend to provide a dashboard for your users to manage their clients. Below, we'll review all of the API endpoints for managing clients. For convenience, we'll use Axios[https://github.com/axios/axios] to demonstrate making HTTP requests to the endpoints.
JSON APIはweb
とauth
ミドルウェアにより保護されています。そのため、みなさん自身のアプリケーションからのみ呼び出せます。外部ソースから呼び出すことはできません。The JSON API is guarded by the web
and auth
middleware; therefore, it may only be called from your own application. It is not able to be called from an external source.
フロントエンド・クイックスタートを使い、短時間で完全に機能するフロントエンドを用意できます。{tip} If you don't want to implement the entire client management frontend yourself, you can use the frontend quickstart[#frontend-quickstart] to have a fully functional frontend in a matter of minutes.
">Tip!! クライアント管理のフロントエンドを自分で実装したくなければ、
GET /oauth/clients
GET /oauth/clients
このルートは認証されたユーザーの全クライアントを返します。ユーザーのクライアントの全リストは、主にクライアントを編集、削除する場合に役立ちます。This route returns all of the clients for the authenticated user. This is primarily useful for listing all of the user's clients so that they may edit or delete them:
axios.get('/oauth/clients')
.then(response => {
console.log(response.data);
});
POST /oauth/clients
POST /oauth/clients
このルートは新クライアントを作成するために使用します。これには2つのデータが必要です。クライアントの名前(name
)と、リダイレクト(redirect
)のURLです。redirect
のURLは許可のリクエストが承認されるか、拒否された後のユーザーのリダイレクト先です。This route is used to create new clients. It requires two pieces of data: the client's name
and a redirect
URL. The redirect
URL is where the user will be redirected after approving or denying a request for authorization.
クライアントを作成すると、クライアントIDとクライアントシークレットが発行されます。これらの値はあなたのアプリケーションへリクエストし、アクセストークンを取得する時に使用されます。クライアント作成ルートは、新しいクライアントインスタンスを返します。When a client is created, it will be issued a client ID and client secret. These values will be used when requesting access tokens from your application. The client creation route will return the new client instance:
const data = {
name: 'Client Name',
redirect: 'http://example.com/callback'
};
axios.post('/oauth/clients', data)
.then(response => {
console.log(response.data);
})
.catch (response => {
// レスポンス上のエラーのリスト
});
PUT /oauth/clients/{client-id}
PUT /oauth/clients/{client-id}
このルートはクライアントを更新するために使用します。それには2つのデータが必要です。クライアントのname
とredirect
のURLです。redirect
のURLは許可のリクエストが承認されるか、拒否され後のユーザーのリダイレクト先です。このルートは更新されたクライアントインスタンスを返します。This route is used to update clients. It requires two pieces of data: the client's name
and a redirect
URL. The redirect
URL is where the user will be redirected after approving or denying a request for authorization. The route will return the updated client instance:
const data = {
name: 'New Client Name',
redirect: 'http://example.com/callback'
};
axios.put('/oauth/clients/' + clientId, data)
.then(response => {
console.log(response.data);
})
.catch (response => {
// レスポンス上のエラーのリスト
});
DELETE /oauth/clients/{client-id}
DELETE /oauth/clients/{client-id}
このルートはクライアントを削除するために使用します。This route is used to delete clients:
axios.delete('/oauth/clients/' + clientId)
.then(response => {
//
});
トークンのリクエストRequesting Tokens
許可のリダイレクトRedirecting For Authorization
クライアントが作成されると、開発者はクライアントIDとシークレットを使用し、あなたのアプリケーションへ許可コードとアクセストークンをリクエストするでしょう。まず、API利用側アプリケーションは以下のように、あなたのアプリケーションの/oauth/authorize
ルートへのリダイレクトリクエストを作成する必要があります。Once a client has been created, developers may use their client ID and secret to request an authorization code and access token from your application. First, the consuming application should make a redirect request to your application's /oauth/authorize
route like so:
Route::get('/redirect', function (Request $request) {
$request->session()->put('state', $state = Str::random(40));
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'response_type' => 'code',
'scope' => '',
'state' => $state,
]);
return redirect('http://your-app.com/oauth/authorize?'.$query);
});
">Tip!!
/oauth/authorize
ルートは、すでにPassport::routes
メソッドが定義づけていることを覚えておいてください。このルートを自分で定義する必要はありません。{tip} Remember, the/oauth/authorize
route is already defined by thePassport::routes
method. You do not need to manually define this route.
リクエストの承認Approving The Request
許可のリクエストを受け取ると、Passportはユーザーがその許可のリクエストを承認するか、拒絶するかのテンプレートを自動的に表示します。ユーザーが許可した場合、API利用側アプリケーションが指定したredirect_uri
へリダイレクトします。redirect_uri
は、クライアントを作成した時に指定したredirect
のURLと一致する必要があります。When receiving authorization requests, Passport will automatically display a template to the user allowing them to approve or deny the authorization request. If they approve the request, they will be redirected back to the redirect_uri
that was specified by the consuming application. The redirect_uri
must match the redirect
URL that was specified when the client was created.
許可の承認ページをカスタマイズしたい場合は、vendor:publish
Artisanコマンドを使い、Passportのビューを公開することでリソースを用意する必要があります。リソース公開されたビューは、resources/views/vendor/passport
へ設置されます。If you would like to customize the authorization approval screen, you may publish Passport's views using the vendor:publish
Artisan command. The published views will be placed in resources/views/vendor/passport
:
php artisan vendor:publish --tag=passport-views
ファーストパーティ製クライアントにより認可中のような場合、認可プロンプトをとばしたい場合もあり得ます。Client
モデルを拡張し、skipsAuthorization
メソッドを定義することで実現できます。skipsAuthorization
がクライアントは認証済みとしてtrue
を返すと、そのユーザーをすぐにredirect_uri
へリダイレクトで戻します。Sometimes you may wish to skip the authorization prompt, such as when authorizing a first-party client. You may accomplish this by extending the Client
model[#overriding-default-models] and defining a skipsAuthorization
method. If skipsAuthorization
returns true
the client will be approved and the user will be redirected back to the redirect_uri
immediately:
<?php
namespace App\Models\Passport;
use Laravel\Passport\Client as BaseClient;
class Client extends BaseClient
{
/**
* クライアントが認可プロンプトを飛ばすべきか決める
*
* @return bool
*/
public function skipsAuthorization()
{
return $this->firstParty();
}
}
許可コードからアクセストークンへの変換Converting Authorization Codes To Access Tokens
ユーザーが許可リクエストを承認したら、API使用側アプリケーションへリダイレクトされます。使用側は最初に、リダイレクトする前に保存していた値と、state
パラメータを確認する必要があります。stateパラメータが一致したら、使用側はあなたのアプリケーションへアクセストークンをリクエストするためのPOST
リクエストを送信する必要があります。そのリクエストには、ユーザーが許可リクエストを承認した時にあなたのアプリケーションが発行した、許可コードを含める必要があります。この例として、Guzzle HTTPライブラリでPOST
リクエストを作成してみましょう。If the user approves the authorization request, they will be redirected back to the consuming application. The consumer should first verify the state
parameter against the value that was stored prior to the redirect. If the state parameter matches the consumer should issue a POST
request to your application to request an access token. The request should include the authorization code that was issued by your application when the user approved the authorization request. In this example, we'll use the Guzzle HTTP library to make the POST
request:
Route::get('/callback', function (Request $request) {
$state = $request->session()->pull('state');
throw_unless(
strlen($state) > 0 && $state === $request->state,
InvalidArgumentException::class
);
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'redirect_uri' => 'http://example.com/callback',
'code' => $request->code,
],
]);
return json_decode((string) $response->getBody(), true);
});
この/oauth/token
ルートは、access_token
、refresh_token
、expires_in
属性を含むJSONレスポンスを返します。expires_in
属性は、アクセストークンが無効になるまでの秒数を含んでいます。This /oauth/token
route will return a JSON response containing access_token
, refresh_token
, and expires_in
attributes. The expires_in
attribute contains the number of seconds until the access token expires.
">Tip!!
/oauth/authorize
ルートと同様に、/oauth/token
ルートはPassport::routes
メソッドが定義しています。このルートを自分で定義する必要はありません。デフォルトでこのルートは、ThrottleRequests
ミドルウェアの設定を利用し、アクセス回数制限されています。{tip} Like the/oauth/authorize
route, the/oauth/token
route is defined for you by thePassport::routes
method. There is no need to manually define this route. By default, this route is throttled using the settings of theThrottleRequests
middleware.
JSON APIJSON API
Passportには、承認済みアクセストークンを管理するためのJSON APIも含んでいます。これを独自のフロントエンドと組み合わせ、アクセストークンを管理するダッシュボードをユーザーへ提供できます。便宜上、AxiosをエンドポイントへのHTTPリクエストを生成するデモンストレーションのため使用しています。JSON APIはweb
とauth
ミドルウェアにより保護されているため、自身のアプリケーションからのみ呼び出しできます。Passport also includes a JSON API for managing authorized access tokens. You may pair this with your own frontend to offer your users a dashboard for managing access tokens. For convenience, we'll use Axios[https://github.com/mzabriskie/axios] to demonstrate making HTTP requests to the endpoints. The JSON API is guarded by the web
and auth
middleware; therefore, it may only be called from your own application.
GET /oauth/tokens
GET /oauth/tokens
このルートは、認証されたユーザーが作成した、承認済みアクセストークンをすべて返します。これは主に取り消すトークンを選んでもらうため、ユーザーの全トークンを一覧リスト表示するのに便利です。This route returns all of the authorized access tokens that the authenticated user has created. This is primarily useful for listing all of the user's tokens so that they can revoke them:
axios.get('/oauth/tokens')
.then(response => {
console.log(response.data);
});
DELETE /oauth/tokens/{token-id}
DELETE /oauth/tokens/{token-id}
このルートは、認証済みアクセストークンと関連するリフレッシュトークンを取り消すために使います。This route may be used to revoke authorized access tokens and their related refresh tokens:
axios.delete('/oauth/tokens/' + tokenId);
トークンのリフレッシュRefreshing Tokens
アプリケーションが短い有効期限のアクセストークンを発行している場合に、ユーザーはアクセストークンを発行する時に提供しているリフレッシュトークンを使用し、アクセストークンをリフレッシュする必要が起きます。以下はGuzzle HTTPライブラリを使用し、トークンをリフレッシュする例です。If your application issues short-lived access tokens, users will need to refresh their access tokens via the refresh token that was provided to them when the access token was issued. In this example, we'll use the Guzzle HTTP library to refresh the token:
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'refresh_token',
'refresh_token' => 'the-refresh-token',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
この/oauth/token
ルートは、access_token
、refresh_token
、expires_in
属性を含むJSONレスポンスを返します。expires_in
属性は、アクセストークンが無効になるまでの秒数を含んでいます。This /oauth/token
route will return a JSON response containing access_token
, refresh_token
, and expires_in
attributes. The expires_in
attribute contains the number of seconds until the access token expires.
トークンの取り消しRevoking Tokens
TokenRepository
のrevokeAccessToken
メソッドを利用し、トークンを取り消せます。トークンのリフレッシュトークンの取り消しはRefreshTokenRepository
のrevokeRefreshTokensByAccessTokenId
メソッドを使います。You may revoke a token by using the revokeAccessToken
method on the TokenRepository
. You may revoke a token's refresh tokens using the revokeRefreshTokensByAccessTokenId
method on the RefreshTokenRepository
:
$tokenRepository = app('Laravel\Passport\TokenRepository');
$refreshTokenRepository = app('Laravel\Passport\RefreshTokenRepository');
// アクセストークンの取り消し
$tokenRepository->revokeAccessToken($tokenId);
// そのトークンのリフレッシュトークンを全て取り消し
$refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
トークンの破棄Purging Tokens
トークンが無効、もしくは期限切れになったら、データベースから一掃する必要があります。Passportはこのためのコマンドを用意しています。When tokens have been revoked or expired, you might want to purge them from the database. Passport ships with a command that can do this for you:
# 無効・期限切れのトークンと認可コードを破棄する
php artisan passport:purge
# 無効なトークンと認可コードのみ破棄する
php artisan passport:purge --revoked
# 期限切れのトークンと認可コードのみ破棄する
php artisan passport:purge --expired
スケジュールに従い自動的にトークンを整理するため、コンソールのKernel
クラスでスケジュール済みジョブとして設定することも可能です。You may also configure a scheduled job[/docs/{{version}}/scheduling] in your console Kernel
class to automatically prune your tokens on a schedule:
/**
* アプリケーションのコマンドスケジュール定義
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('passport:purge')->hourly();
}
PKCEを使った認可コードグラントAuthorization Code Grant with PKCE
"Proof Key for Code Exchange" (PKCE)を使用する認可コードグラントは、シングルページアプリケーションやネイティブアプリケーションが、APIへアクセスするための安全な認証方法です。このグラントはクライアントの秘密コードを十分な機密を保ち保存できないか、もしくは認可コード横取り攻撃の危険を軽減する必要がある場合に、必ず使用すべきです。アクセストークンのために認可コードを交換するときに、クライアントの秘密コードを「コードベリファイヤ(code verifier)」と「コードチャレンジ(code challenge)」のコンピネーションに置き換えます。The Authorization Code grant with "Proof Key for Code Exchange" (PKCE) is a secure way to authenticate single page applications or native applications to access your API. This grant should be used when you can't guarantee that the client secret will be stored confidentially or in order to mitigate the threat of having the authorization code intercepted by an attacker. A combination of a "code verifier" and a "code challenge" replaces the client secret when exchanging the authorization code for an access token.
クライアント生成Creating The Client
PKCEを使用した認可コードグラントを通じトークンを発行する前に、PKCE可能なクライアントを生成する必要があります。passport:client
コマンドを--public
オプション付きで実行してください。Before your application can issue tokens via the authorization code grant with PKCE, you will need to create a PKCE-enabled client. You may do this using the passport:client
command with the --public
option:
php artisan passport:client --public
トークンのリクエストRequesting Tokens
コードベリファイヤとコードチャレンジCode Verifier & Code Challenge
この認可グラントではクライアント秘密コードが提供されないため、開発者はトークンを要求するためにコードベリファイヤとコードチャレンジのコンビネーションを生成する必要があります。As this authorization grant does not provide a client secret, developers will need to generate a combination of a code verifier and a code challenge in order to request a token.
コードベリファイヤはRFC 7636仕様で定義されている通り、43から128文字の文字、数字、"-"
、"."
、"_"
、"~"
を含んだランダムな文字列の必要があります。The code verifier should be a random string of between 43 and 128 characters containing letters, numbers and "-"
, "."
, "_"
, "~"
, as defined in the RFC 7636 specification[https://tools.ietf.org/html/rfc7636].
コードチャレンジはURL/ファイルネームセーフな文字をBase64エンコードしたものである必要があります。文字列終端の'='
文字を削除し、ラインブレイクやホワイトスペースを含まず、その他はそのままにします。The code challenge should be a Base64 encoded string with URL and filename-safe characters. The trailing '='
characters should be removed and no line breaks, whitespace, or other additional characters should be present.
$encoded = base64_encode(hash('sha256', $code_verifier, true));
$codeChallenge = strtr(rtrim($encoded, '='), '+/', '-_');
許可のリダイレクトRedirecting For Authorization
クライアントが生成できたら、アプリケーションから認可コードとアクセストークンをリクエストするために、クライアントIDと生成したコードベリファイヤ、コードチャレンジを使用します。最初に、認可要求側のアプリケーションは、あなたのアプリケーションの/oauth/authorize
ルートへのリダイレクトリクエストを生成する必要があります。Once a client has been created, you may use the client ID and the generated code verifier and code challenge to request an authorization code and access token from your application. First, the consuming application should make a redirect request to your application's /oauth/authorize
route:
Route::get('/redirect', function (Request $request) {
$request->session()->put('state', $state = Str::random(40));
$request->session()->put('code_verifier', $code_verifier = Str::random(128));
$codeChallenge = strtr(rtrim(
base64_encode(hash('sha256', $code_verifier, true))
, '='), '+/', '-_');
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'response_type' => 'code',
'scope' => '',
'state' => $state,
'code_challenge' => $codeChallenge,
'code_challenge_method' => 'S256',
]);
return redirect('http://your-app.com/oauth/authorize?'.$query);
});
許可コードからアクセストークンへの変換Converting Authorization Codes To Access Tokens
ユーザーが認可リクエストを承認すると、認可要求側のアプリケーションへリダイレクで戻されます。認可要求側では認可コードグラントの規約に従い、リダイレクトの前に保存しておいた値と、state
パラメータを検証する必要があります。If the user approves the authorization request, they will be redirected back to the consuming application. The consumer should verify the state
parameter against the value that was stored prior to the redirect, as in the standard Authorization Code Grant.
stateパラメータが一致したら、要求側はアクセストークンをリクエストするために、あなたのアプリケーションへPOST
リクエストを発行する必要があります。そのリクエストは最初に生成したコードベリファイヤと同時に、ユーザーが認可リクエストを承認したときにあなたのアプリケーションが発行した認可コードを持っている必要があります。If the state parameter matches, the consumer should issue a POST
request to your application to request an access token. The request should include the authorization code that was issued by your application when the user approved the authorization request along with the originally generated code verifier:
Route::get('/callback', function (Request $request) {
$state = $request->session()->pull('state');
$codeVerifier = $request->session()->pull('code_verifier');
throw_unless(
strlen($state) > 0 && $state === $request->state,
InvalidArgumentException::class
);
$response = (new GuzzleHttp\Client)->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'code_verifier' => $codeVerifier,
'code' => $request->code,
],
]);
return json_decode((string) $response->getBody(), true);
});
パスワードグラントのトークンPassword Grant Tokens
OAuth2のパスワードグラントはモバイルアプリケーションのような、その他のファーストパーティクライアントへ、メールアドレス/ユーザー名とパスワードを使ったアクセストークンの取得を提供します。これによりOAuth2のAuthorization Codeリダイレクトフローに完全に従うことをユーザーへ要求せずとも、アクセストークンを安全に発行できます。The OAuth2 password grant allows your other first-party clients, such as a mobile application, to obtain an access token using an e-mail address / username and password. This allows you to issue access tokens securely to your first-party clients without requiring your users to go through the entire OAuth2 authorization code redirect flow.
パスワードグラントクライアントの作成Creating A Password Grant Client
パスワードグラントにより、あなたのアプリケーションがトークンを発行する前に、パスワードグラントクライアントを作成する必要があります。それには、passport:client
コマンドで--password
を使用してください。すでにpassport:install
コマンドを実行済みの場合、このコマンドを実行する必要はありません。Before your application can issue tokens via the password grant, you will need to create a password grant client. You may do this using the passport:client
command with the --password
option. If you have already run the passport:install
command, you do not need to run this command:
php artisan passport:client --password
トークンのリクエストRequesting Tokens
パスワードグラントクライアントを作成したら、ユーザーのメールアドレスとパスワードを指定し、/oauth/token
ルートへPOST
リクエストを発行することで、アクセストークンをリクエストできます。このルートは、Passport::routes
メソッドが登録しているため、自分で定義する必要がないことを覚えておきましょう。リクエストに成功すると、サーバからaccess_token
とrefresh_token
のJSONレスポンスを受け取ります。Once you have created a password grant client, you may request an access token by issuing a POST
request to the /oauth/token
route with the user's email address and password. Remember, this route is already registered by the Passport::routes
method so there is no need to define it manually. If the request is successful, you will receive an access_token
and refresh_token
in the JSON response from the server:
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
アクセストークンの最長持続時間を設定できます。{tip} Remember, access tokens are long-lived by default. However, you are free to configure your maximum access token lifetime[#configuration] if needed.
">Tip!! アクセストークンはデフォルトで、長期間有効であることを記憶しておきましょう。ただし、必要であれば自由に、
全スコープの要求Requesting All Scopes
パスワードグラント、またはクライアント認証情報グラントを使用時は、あなたのアプリケーションでサポートする全スコープを許可するトークンを発行したいと考えるかと思います。*
スコープをリクエストすれば可能です。*
スコープをリクエストすると、そのトークンインスタンスのcan
メソッドは、いつもtrue
を返します。このスコープはpassword
かclient_credentials
グラントを使って発行されたトークのみに割り付けるのが良いでしょう。When using the password grant or client credentials grant, you may wish to authorize the token for all of the scopes supported by your application. You can do this by requesting the *
scope. If you request the *
scope, the can
method on the token instance will always return true
. This scope may only be assigned to a token that is issued using the password
or client_credentials
grant:
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '*',
],
]);
ユーザープロバイダのカスタマイズCustomizing The User Provider
アプリケーションが認証ユーザープロバイダを複数使用している場合、artisan passport:client --password
コマンドによりクライアントを制作する時に、--provider
オプションによりパスワードグランツクライアントで使用するユーザープロバイダを指定します。指定プロバイダ名はconfig/auth.php
設定ファイルで定義した有効なプロバイダと一致している必用があります。次に、[ミドルウェアを使用してルートを保護](#via-middleware)して、ガードの指定したプロバイダのユーザーのみ認証するようにします。If your application uses more than one authentication user provider[/docs/{{version}}/authentication#introduction], you may specify which user provider the password grant client uses by providing a --provider
option when creating the client via the artisan passport:client --password
command. The given provider name should match a valid provider defined in your config/auth.php
configuration file. You can then protect your route using middleware[#via-middleware] to ensure that only users from the guard's specified provider are authorized.
ユーザー名フィールドのカスタマイズCustomizing The Username Field
パスワードグラントを使用する認証を行う場合、Passportはモデルのemail
属性をユーザー名("username")として利用します。しかし、モデルのfindForPassport
メソッドを定義することで、この振る舞いをカスタマイズできます。When authenticating using the password grant, Passport will use the email
attribute of your model as the "username". However, you may customize this behavior by defining a findForPassport
method on your model:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* 指定されたユーザー名のユーザーインスタンスを見つける
*
* @param string $username
* @return \App\User
*/
public function findForPassport($username)
{
return $this->where('username', $username)->first();
}
}
パスワードバリデーションのカスタマイズCustomizing The Password Validation
パスワードガードを使用して認証している場合、Passportは指定されたパスワードを確認するためにモデルのpassword
属性を使用します。もし、password
属性を持っていないか、パスワードのバリデーションロジックをカスタマイズしたい場合は、モデルのvalidateForPassportPasswordGrant
メソッドを定義してください。When authenticating using the password grant, Passport will use the password
attribute of your model to validate the given password. If your model does not have a password
attribute or you wish to customize the password validation logic, you can define a validateForPassportPasswordGrant
method on your model:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* Passportパスワードグラントのために、ユーザーのパスワードをバリデート
*
* @param string $password
* @return bool
*/
public function validateForPassportPasswordGrant($password)
{
return Hash::check($password, $this->password);
}
}
暗黙のグラントトークンImplicit Grant Tokens
暗黙のグラントは認可コードのグラントと似ています。違いは認可コードの交換をせずにクライアントへトークンが返されることです。一般的にこのグラントは、JavaScriptやモバイルアプリケーションでクライアントの認証情報を安全に保存できない場合に使用します。このグラントを有効にするには、AuthServiceProvider
でenableImplicitGrant
メソッドを呼び出します。The implicit grant is similar to the authorization code grant; however, the token is returned to the client without exchanging an authorization code. This grant is most commonly used for JavaScript or mobile applications where the client credentials can't be securely stored. To enable the grant, call the enableImplicitGrant
method in your AuthServiceProvider
:
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::enableImplicitGrant();
}
グラントを有効にしたら、開発者はあなたのアプリケーションからのアクセストークンをリクエストするために、クライアントIDを使うことになるでしょう。使用側アプリケーションは、あなたのアプリケーションの/oauth/authorize
ルートへのリダイレクトリクエストを生成する必要があります。例を確認してください。Once a grant has been enabled, developers may use their client ID to request an access token from your application. The consuming application should make a redirect request to your application's /oauth/authorize
route like so:
Route::get('/redirect', function (Request $request) {
$request->session()->put('state', $state = Str::random(40));
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'response_type' => 'token',
'scope' => '',
'state' => $state,
]);
return redirect('http://your-app.com/oauth/authorize?'.$query);
});
">Tip!!
/oauth/authorize
ルートは、すでにPassport::routes
メソッドが定義づけていることを覚えておいてください。このルートを自分で定義する必要はありません。{tip} Remember, the/oauth/authorize
route is already defined by thePassport::routes
method. You do not need to manually define this route.
クライアント認証情報グラントトークンClient Credentials Grant Tokens
クライアント認証情報グラントはマシンーマシン間の認証に最適です。たとえば、APIによりメンテナンスタスクを実行する、定期実行ジョブに使用できます。The client credentials grant is suitable for machine-to-machine authentication. For example, you might use this grant in a scheduled job which is performing maintenance tasks over an API.
クライアント認証情報グラントによりトークンを発行する前に、クライアント認証情報グラントクライアントを生成する必要があります。passport:client
コマンドで、--client
オプションを使用してください。Before your application can issue tokens via the client credentials grant, you will need to create a client credentials grant client. You may do this using the --client
option of the passport:client
command:
php artisan passport:client --client
次に、このグラントタイプを使用するために、app/Http/Kernel.php
ファイルの$routeMiddleware
へ、CheckClientCredentials
ミドルウェアを追加する必要があります。Next, to use this grant type, you need to add the CheckClientCredentials
middleware to the $routeMiddleware
property of your app/Http/Kernel.php
file:
use Laravel\Passport\Http\Middleware\CheckClientCredentials;
protected $routeMiddleware = [
'client' => CheckClientCredentials::class,
];
それから、ルートへこのミドルウェアを指定します。Then, attach the middleware to a route:
Route::get('/orders', function (Request $request) {
...
})->middleware('client');
スコープを指定しアクセスを制限するには、ルートへclient
ミドルウェアを指定する時に、カンマ区切りで指定します。To restrict access to the route to specific scopes you may provide a comma-delimited list of the required scopes when attaching the client
middleware to the route:
Route::get('/orders', function (Request $request) {
...
})->middleware('client:check-status,your-scope');
トークンの取得Retrieving Tokens
このグラントタイプを使うトークンを取得するため、oauth/token
エンドポイントへリクエストを送ります。To retrieve a token using this grant type, make a request to the oauth/token
endpoint:
$guzzle = new GuzzleHttp\Client;
$response = $guzzle->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => 'your-scope',
],
]);
return json_decode((string) $response->getBody(), true)['access_token'];
パーソナルアクセストークンPersonal Access Tokens
ときどき、あなたのユーザーが典型的なコードリダイレクションフローに従うのではなく、自分たち自身でアクセストークンを発行したがることもあるでしょう。あなたのアプリケーションのUIを通じて、ユーザー自身のトークンを発行を許可することにより、あなたのAPIをユーザーに経験してもらう事ができますし、全般的なアクセストークン発行するシンプルなアプローチとしても役立つでしょう。Sometimes, your users may want to issue access tokens to themselves without going through the typical authorization code redirect flow. Allowing users to issue tokens to themselves via your application's UI can be useful for allowing users to experiment with your API or may serve as a simpler approach to issuing access tokens in general.
パーソナルアクセスクライアントの作成Creating A Personal Access Client
あなたのアプリケーションでパーソナルアクセストークンを発行する前に、パーソナルアクセスクライアントを作成する必要があります。--personal
オプションを付け、passport:client
コマンドを実行すれば、作成できます。passport:install
コマンドを実行済みの場合、このコマンドを実行する必要はありません。Before your application can issue personal access tokens, you will need to create a personal access client. You may do this using the passport:client
command with the --personal
option. If you have already run the passport:install
command, you do not need to run this command:
php artisan passport:client --personal
パーソナルアクセスクライアントを制作したら、クライアントIDと平文シークレット値をアプリケーションの.env
ファイルに設定してください。After creating your personal access client, place the client's ID and plain-text secret value in your application's .env
file:
PASSPORT_PERSONAL_ACCESS_CLIENT_ID=client-id-value
PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=unhashed-client-secret-value
次に、AuthServiceProvider
のboot
メソッドの中で、Passport::personalAccessClientId
とPassport::personalAccessClientSecret
を呼び出し、これらの値を登録します。Next, you should register these values by placing the following calls to Passport::personalAccessClientId
and Passport::personalAccessClientSecret
within the boot
method of your AuthServiceProvider
:
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::personalAccessClientId(
config('passport.personal_access_client.id')
);
Passport::personalAccessClientSecret(
config('passport.personal_access_client.secret')
);
}
パーソナルアクセストークンの管理Managing Personal Access Tokens
パーソナルアクセスクライアントを作成したら、User
モデルインスタンスのcreateToken
メソッドを使用し、指定ユーザーに対しトークンを発行することができるようになります。createToken
メソッドは最初の引数として、トークンの名前を受け付けます。任意の第2引数として、スコープの配列を指定できます。Once you have created a personal access client, you may issue tokens for a given user using the createToken
method on the User
model instance. The createToken
method accepts the name of the token as its first argument and an optional array of scopes[#token-scopes] as its second argument:
$user = App\User::find(1);
// スコープ無しのトークンを作成する
$token = $user->createToken('Token Name')->accessToken;
// スコープ付きのトークンを作成する
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
JSON APIJSON API
Passportにはパーソナルアクセストークンを管理するためのJSON APIも含まれています。ユーザーにパーソナルアクセストークンを管理してもらうダッシュボードを提供するため、APIと皆さんのフロントエンドを結びつける必要があるでしょう。以降から、パーソナルアクセストークンを管理するためのAPIエンドポイントをすべて説明します。利便性を考慮し、エンドポイントへのHTTPリクエスト作成をデモンストレートするために、Axiosを使用していきましょう。Passport also includes a JSON API for managing personal access tokens. You may pair this with your own frontend to offer your users a dashboard for managing personal access tokens. Below, we'll review all of the API endpoints for managing personal access tokens. For convenience, we'll use Axios[https://github.com/mzabriskie/axios] to demonstrate making HTTP requests to the endpoints.
JSON APIはweb
とauth
ミドルウェアにより保護されています。そのため、みなさん自身のアプリケーションからのみ呼び出せます。外部ソースから呼び出すことはできません。The JSON API is guarded by the web
and auth
middleware; therefore, it may only be called from your own application. It is not able to be called from an external source.
フロントエンドクイックスタートを使用して、短時間に完全な機能を持つフロントエンドを用意できます。{tip} If you don't want to implement the personal access token frontend yourself, you can use the frontend quickstart[#frontend-quickstart] to have a fully functional frontend in a matter of minutes.
">Tip!! パーソナルアクセストークンのフロントエンドを自分自身で実装したくない場合は、
GET /oauth/scopes
GET /oauth/scopes
このルートはあなたのアプリケーションで定義した、全スコープを返します。このルートを使い、ユーザーがパーソナルアクセストークンに割り付けたスコープをリストできます。This route returns all of the scopes[#token-scopes] defined for your application. You may use this route to list the scopes a user may assign to a personal access token:
axios.get('/oauth/scopes')
.then(response => {
console.log(response.data);
});
GET /oauth/personal-access-tokens
GET /oauth/personal-access-tokens
このルートは認証中のユーザーが作成したパーソナルアクセストークンをすべて返します。ユーザーがトークンの編集や取り消しを行うため、全トークンをリストするために主に使われます。This route returns all of the personal access tokens that the authenticated user has created. This is primarily useful for listing all of the user's tokens so that they may edit or revoke them:
axios.get('/oauth/personal-access-tokens')
.then(response => {
console.log(response.data);
});
POST /oauth/personal-access-tokens
POST /oauth/personal-access-tokens
このルートは新しいパーソナルアクセストークンを作成します。トークンの名前(name
)と、トークンに割り付けるスコープ(scope
)の、2つのデータが必要です。This route creates new personal access tokens. It requires two pieces of data: the token's name
and the scopes
that should be assigned to the token:
const data = {
name: 'Token Name',
scopes: []
};
axios.post('/oauth/personal-access-tokens', data)
.then(response => {
console.log(response.data.accessToken);
})
.catch (response => {
// レスポンス上のエラーのリスト
});
DELETE /oauth/personal-access-tokens/{token-id}
DELETE /oauth/personal-access-tokens/{token-id}
このルートはパーソナルアクセストークンを取り消すために使用します。This route may be used to revoke personal access tokens:
axios.delete('/oauth/personal-access-tokens/' + tokenId);
ルート保護Protecting Routes
ミドルウェアによる保護Via Middleware
Passportは送信されてきたリクエスト上のアクセストークンをバリデートする、認証ガードを用意しています。passport
ドライバをapi
ガードで使うように設定すれば、あとはアクセストークンをバリデートしたいルートに、auth:api
ミドルウェアを指定するだけです。Passport includes an authentication guard[/docs/{{version}}/authentication#adding-custom-guards] that will validate access tokens on incoming requests. Once you have configured the api
guard to use the passport
driver, you only need to specify the auth:api
middleware on any routes that require a valid access token:
Route::get('/user', function () {
//
})->middleware('auth:api');
複数認証ガードMultiple Authentication Guards
アプリケーションの認証でたぶんまったく異なるEloquentモデルを使用する、別々のタイプのユーザーを認証する場合、それぞれのユーザープロバイダタイプごとにガード設定を定義する必用があるでしょう。これにより特定ユーザープロバイダ向けのリクエストを保護できます。例としてconfig/auth.php
設定ファイルで以下のようなガード設定を行っているとしましょう。If your application authenticates different types of users that perhaps use entirely different Eloquent models, you will likely need to define a guard configuration for each user provider type in your application. This allows you to protect requests intended for specific user providers. For example, given the following guard configuration the config/auth.php
configuration file:
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
'api-customers' => [
'driver' => 'passport',
'provider' => 'customers',
],
以下のルートは受信リクエストを認証するためcustomers
ユーザープロバイダを使用するapi-customers
ガードを使用します。The following route will utilize the api-customers
guard, which uses the customers
user provider, to authenticate incoming requests:
Route::get('/customer', function () {
//
})->middleware('auth:api-customers');
パスワードグラントのドキュメントを調べてください。{tip} For more information on using multiple user providers with Passport, please consult the password grant documentation[#customizing-the-user-provider].
">Tip!! Passportを使用する複数ユーザープロバイダ利用の詳細は、
アクセストークンの受け渡しPassing The Access Token
Passportにより保護されているルートを呼び出す場合、あなたのアプリケーションのAPI利用者は、リクエストのAuthorization
ヘッダとして、アクセストークンをBearer
トークンとして指定する必要があります。Guzzle HTTPライブラリを使う場合を例として示します。When calling routes that are protected by Passport, your application's API consumers should specify their access token as a Bearer
token in the Authorization
header of their request. For example, when using the Guzzle HTTP library:
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
トークンのスコープToken Scopes
スコープは、あるアカウントにアクセスする許可がリクエストされたとき、あなたのAPIクライアントに限定された一連の許可をリクエストできるようにします。たとえば、eコマースアプリケーションを構築している場合、全API利用者へ発注する許可を与える必要はないでしょう。代わりに、利用者へ注文の発送状況にアクセスできる許可を与えれば十分です。言い換えれば、スコープはアプリケーションユーザーに対し、彼らの代理としてのサードパーティアプリケーションが実行できるアクションを制限できるようにします。Scopes allow your API clients to request a specific set of permissions when requesting authorization to access an account. For example, if you are building an e-commerce application, not all API consumers will need the ability to place orders. Instead, you may allow the consumers to only request authorization to access order shipment statuses. In other words, scopes allow your application's users to limit the actions a third-party application can perform on their behalf.
スコープの定義Defining Scopes
AuthServiceProvider
のboot
メソッドの中で、Passport::tokensCan
メソッドを用い、皆さんのAPIのスコープを定義できます。tokenCan
メソッドはスコープ名とスコープの説明の配列を引数に取ります。スコープの説明はお望み通りに記述でき、許可の承認ページでユーザーに表示されます。You may define your API's scopes using the Passport::tokensCan
method in the boot
method of your AuthServiceProvider
. The tokensCan
method accepts an array of scope names and scope descriptions. The scope description may be anything you wish and will be displayed to users on the authorization approval screen:
use Laravel\Passport\Passport;
Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
デフォルトスコープDefault Scope
クライアントが特定のスコープを要求しない場合は、setDefaultScope
メソッドを使用しそのトークンにデフォルトスコープを付加するように、Passportサーバを設定できます。通常、このメソッドはAuthServiceProvider
のboot
メソッドで呼び出す必要があります。If a client does not request any specific scopes, you may configure your Passport server to attach a default scope to the token using the setDefaultScope
method. Typically, you should call this method from the boot
method of your AuthServiceProvider
:
use Laravel\Passport\Passport;
Passport::setDefaultScope([
'check-status',
'place-orders',
]);
トークンへのスコープ割り付けAssigning Scopes To Tokens
許可コードのリクエスト時When Requesting Authorization Codes
許可コードグラントを用い、アクセストークンをリクエストする際、利用者はscope
クエリ文字列パラメータとして、希望するスコープを指定する必要があります。scope
パラメータはスコープを空白で区切ったリストです。When requesting an access token using the authorization code grant, consumers should specify their desired scopes as the scope
query string parameter. The scope
parameter should be a space-delimited list of scopes:
Route::get('/redirect', function () {
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'response_type' => 'code',
'scope' => 'place-orders check-status',
]);
return redirect('http://your-app.com/oauth/authorize?'.$query);
});
パーソナルアクセストークン発行時When Issuing Personal Access Tokens
User
モデルのcreateToken
メソッドを使用し、パーソナルアクセストークンを発行する場合、メソッドの第2引数として希望するスコープを配列で渡します。If you are issuing personal access tokens using the User
model's createToken
method, you may pass the array of desired scopes as the second argument to the method:
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
スコープのチェックChecking Scopes
Passportには、指定されたスコープが許可されているトークンにより、送信されたリクエストが認証されているかを確認するために使用できる、2つのミドルウエアが用意されています。これを使用するには、app/Http/Kernel.php
ファイルの$routeMiddleware
プロパティへ、以下のミドルウェアを追加してください。Passport includes two middleware that may be used to verify that an incoming request is authenticated with a token that has been granted a given scope. To get started, add the following middleware to the $routeMiddleware
property of your app/Http/Kernel.php
file:
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
全スコープの確認Check For All Scopes
scopes
ミドルウェアは、リストしたスコープがすべて、送信されてきたリクエストのアクセストークンに含まれていることを確認するため、ルートへ指定します。The scopes
middleware may be assigned to a route to verify that the incoming request's access token has all of the listed scopes:
Route::get('/orders', function () {
// アクセストークンは"check-status"と"place-orders"、両スコープを持っている
})->middleware(['auth:api', 'scopes:check-status,place-orders']);
一部のスコープの確認Check For Any Scopes
scope
ミドルウエアは、リストしたスコープのうち、最低1つが送信されてきたリクエストのアクセストークンに含まれていることを確認するため、ルートへ指定します。The scope
middleware may be assigned to a route to verify that the incoming request's access token has at least one of the listed scopes:
Route::get('/orders', function () {
// アクセストークンは、"check-status"か"place-orders"、どちらかのスコープを持っている
})->middleware(['auth:api', 'scope:check-status,place-orders']);
トークンインスタンスでのスコープチェックChecking Scopes On A Token Instance
アクセストークンを確認されたリクエストがアプリケーションにやってきた後でも、認証済みのUser
インスタンスへtokenCan
メソッドを使用し、トークンが指定したスコープを持っているかを確認できます。Once an access token authenticated request has entered your application, you may still check if the token has a given scope using the tokenCan
method on the authenticated User
instance:
use Illuminate\Http\Request;
Route::get('/orders', function (Request $request) {
if ($request->user()->tokenCan('place-orders')) {
//
}
});
その他のスコープメソッドAdditional Scope Methods
scopeIds
メソッドは定義済みの全ID/名前の配列を返します。The scopeIds
method will return an array of all defined IDs / names:
Laravel\Passport\Passport::scopeIds();
scopes
メソッドは定義済みの全スコープをLaravel\Passport\Scope
のインスタンスの配列として返します。The scopes
method will return an array of all defined scopes as instances of Laravel\Passport\Scope
:
Laravel\Passport\Passport::scopes();
scopesFor
メソッドは、指定したID/名前に一致するLaravel\Passport\Scope
インスタンスの配列を返します。The scopesFor
method will return an array of Laravel\Passport\Scope
instances matching the given IDs / names:
Laravel\Passport\Passport::scopesFor(['place-orders', 'check-status']);
指定したスコープが定義済みであるかを判定するには、hasScope
メソッドを使います。You may determine if a given scope has been defined using the hasScope
method:
Laravel\Passport\Passport::hasScope('place-orders');
APIをJavaScriptで利用Consuming Your API With JavaScript
API構築時にJavaScriptアプリケーションから、自分のAPIを利用できたらとても便利です。このAPI開発のアプローチにより、世界中で共有されるのと同一のAPIを自身のアプリケーションで使用できるようになります。自分のWebアプリケーションやモバイルアプリケーション、サードパーティアプリケーション、そしてさまざまなパッケージマネージャ上で公開するSDKにより、同じAPIが使用されます。When building an API, it can be extremely useful to be able to consume your own API from your JavaScript application. This approach to API development allows your own application to consume the same API that you are sharing with the world. The same API may be consumed by your web application, mobile applications, third-party applications, and any SDKs that you may publish on various package managers.
通常、皆さんのAPIをJavaScriptアプリケーションから使用しようとするなら、アプリケーションに対しアクセストークンを自分で送り、それを毎回リクエストするたび、一緒にアプリケーションへ渡す必要があります。しかし、Passportにはこれを皆さんに変わって処理するミドルウェアが用意してあります。必要なのはapp/Http/Kernel.php
ファイル中の、web
ミドルウェアグループに対し、CreateFreshApiToken
ミドルウェアを追加することだけです。Typically, if you want to consume your API from your JavaScript application, you would need to manually send an access token to the application and pass it with each request to your application. However, Passport includes a middleware that can handle this for you. All you need to do is add the CreateFreshApiToken
middleware to your web
middleware group in your app/Http/Kernel.php
file:
'web' => [
// 他のミドルウェア…
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
Note:
ミドルウェアの指定の中で、CreateFreshApiToken
ミドルウェアを確実に最後へリストしてください。{note} You should ensure that theCreateFreshApiToken
middleware is the last middleware listed in your middleware stack.
このPassportミドルウェアはlaravel_token
クッキーを送信するレスポンスへ付加します。このクッキーはPassportが、皆さんのJavaScriptアプリケーションからのAPIリクエストを認可するために使用する、暗号化されたJWTを含んでいます。JWTはsession.lifetime
設定値と同じ有効期間です。これで、アクセストークンを明示的に渡さなくても、あなたのアプリケーションのAPIへリクエストを作成できるようになります。This Passport middleware will attach a laravel_token
cookie to your outgoing responses. This cookie contains an encrypted JWT that Passport will use to authenticate API requests from your JavaScript application. The JWT has a lifetime equal to your session.lifetime
configuration value. Now, you may make requests to your application's API without explicitly passing an access token:
axios.get('/api/user')
.then(response => {
console.log(response.data);
});
クッキー名のカスタマイズCustomizing The Cookie Name
必要であれば、Passport::cookie
メソッドを使用し、laravel_token
クッキーの名前をカスタマイズできます。通常、このメソッドはAuthServiceProvider
のboot
メソッドから呼び出します。If needed, you can customize the laravel_token
cookie's name using the Passport::cookie
method. Typically, this method should be called from the boot
method of your AuthServiceProvider
:
/**
* 全認証/認可の登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::cookie('custom_name');
}
CSRF保護CSRF Protection
この認証方法を使用する場合、リクエストのヘッダに有効なCSRFトークンを確実に含める必要があります。デフォルトのLaravel JavaScriptスカフォールドはAxiosインスタンスを含み、同一オリジンリクエスト上にX-XSRF-TOKEN
ヘッダを送るために、暗号化されたXSRF-TOKEN
クッキーを自動的に使用します。When using this method of authentication, you will need to ensure a valid CSRF token header is included in your requests. The default Laravel JavaScript scaffolding includes an Axios instance, which will automatically use the encrypted XSRF-TOKEN
cookie value to send a X-XSRF-TOKEN
header on same-origin requests.
">Tip!!
X-XSRF-TOKEN
の代わりにX-CSRF-TOKEN
ヘッダを送る方法を取る場合は、csrf_token()
により提供される復元したトークンを使用する必要があります。{tip} If you choose to send theX-CSRF-TOKEN
header instead ofX-XSRF-TOKEN
, you will need to use the unencrypted token provided bycsrf_token()
.
イベントEvents
Passportはアクセストークン発行時とトークンリフレッシュ時にイベントを発行します。これらのイベントをデータベース状の他のアクセストークンを破棄したり、無効にしたりするために使用できます。アプリケーションのEventServiceProvider
で、これらのイベントをリッスンできます。Passport raises events when issuing access tokens and refresh tokens. You may use these events to prune or revoke other access tokens in your database. You may attach listeners to these events in your application's EventServiceProvider
:
/**
* アプリケーションのイベントリスナマッピング
*
* @var array
*/
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
];
テストTesting
PassportのactingAs
メソッドは、現在認証中のユーザーを指定すると同時にスコープも指定します。actingAs
メソッドの最初の引数はユーザーのインスタンスで、第2引数はユーザートークンに許可するスコープ配列を指定します。Passport's actingAs
method may be used to specify the currently authenticated user as well as its scopes. The first argument given to the actingAs
method is the user instance and the second is an array of scopes that should be granted to the user's token:
use App\User;
use Laravel\Passport\Passport;
public function testServerCreation()
{
Passport::actingAs(
factory(User::class)->create(),
['create-servers']
);
$response = $this->post('/api/create-server');
$response->assertStatus(201);
}
PassportのactingAsClient
メソッドは、現在認証中のクライアントを指定すると同時にスコープも指定します。actingAsClient
メソッドの最初の引数はクライアントインスタンスで、第2引数はクライアントのトークンへ許可するスコープの配列です。Passport's actingAsClient
method may be used to specify the currently authenticated client as well as its scopes. The first argument given to the actingAsClient
method is the client instance and the second is an array of scopes that should be granted to the client's token:
use Laravel\Passport\Client;
use Laravel\Passport\Passport;
public function testGetOrders()
{
Passport::actingAsClient(
factory(Client::class)->create(),
['check-status']
);
$response = $this->get('/api/orders');
$response->assertStatus(200);
}