パスポートのOAuth認証
- カスタム移行
- 入手フロントエンドからすぐに開始しました
- パスポートのデプロイ
- アクセス トークンを発行する
- クライアントの管理
- パスポート:クライアント コマンド
- ##JSON API #GET /oauth/clients
- POST /oauth/clients
- PUT /oauth/clients/{client-id}
- #DELETE / oauth/clients/{クライアント ID}
- #リクエスト トークン
- パスワード認可トークン
- パスワード認可クライアントの作成
- クライアント資格情報承認トークン
- トークンの取得
- 作成Personal Access Client
- Personal Access Token の管理
- JSON API
- GET / oauth/scopes
- ##GET /oauth/personal-access-tokens
- POST /oauth/personal-access-tokens
- ##DELETE /oauth/personal-access-tokens/{トークン ID}
- ルート保護
- トークン スコープ
- Cookie 名のカスタマイズ
- CSRF 保護
- イベント
- テスト
- ##
- 概要
- インストール
- 構成
- アクセス トークンを発行する
- パスワード認証タグ
- #クライアント認証トークン #個人アクセス トークン
- ##個人アクセス トークンを作成するクライアント
- #個人アクセス トークンの管理
- アクセス トークンを渡す デフォルト スコープ
はじめに
Laravel では、従来のフォームに基づいてログインと承認を実装するのは非常に簡単ですが、API シナリオで承認要件を満たすにはどうすればよいでしょうか? API シナリオでは、通常、ユーザー認証はリクエスト間のセッション状態を維持するのではなく、トークンを通じて実装されます。 Laravel プロジェクトで Passport を使用すると、API 認可と認証を簡単に実装でき、Passport を使用すると、アプリケーションに完全な OAuth2 サーバー実装を数分で提供できます。パスポートは、Andy Millington と Simon Hamp によって保守されている League OAuth2 サーバー 上に構築されています。
{note} このドキュメントは、OAuth2 についてすでに理解していることを前提としています。 OAuth2 を知らない場合は、読む前に OAuth2 の 一般用語 と機能をよく理解してください。
インストール始める前に、Composer パッケージ マネージャーを介して Passport をインストールします。
composer require laravel/passport
Passport サービス プロバイダーは、フレームワークを使用して独自のデータベース移行ディレクトリを登録するため、プロバイダーを登録した後、Passport の移行コマンドを実行して、クライアントとトークンを格納するデータ テーブルを自動的に作成する必要があります:
php artisan migrate
Next 、
passport:installコマンドを実行して、安全なアクセス トークンの生成に必要な暗号化キーを作成します。このコマンドは、アクセス トークンの生成に使用される「個人アクセス」クライアントも作成します。クライアントと「パスワード認証」 client:
Laravel\Passport\HasApiTokens
上記のコマンドを実行した後、php artisan passport:install
トレイトを
AuthServiceProviderApp\User
モデルに追加してください。このトレイトはモデルにいくつかの機能を提供します。認証されたユーザーのトークンと使用範囲を確認するためのヘルパー関数:
次に、<?php namespace App; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use HasApiTokens, Notifiable; }
の
config/auth.phpboot
のPassport::routes
関数メソッド内で呼び出されます。この関数は、アクセス トークンの発行、アクセス トークン、クライアントおよび個人のアクセス トークンの取り消しに必要なルートを登録します。
最後に、構成ファイル<?php namespace App\Providers; use Laravel\Passport\Passport; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 应用程序的策略映射。 * * @var array */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', ]; /** * 注册任何认证/授权服务。 * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); } }
を追加します。認可ガード
guards
のapi
のオプションが
passportに変更されました。この調整により、アプリケーションは受信 API リクエストを検証するときに Passport の
TokenGuardを使用するようになります:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
Custom Migrations
AppServiceProvider
のregister
メソッドで
Passport::ignoreMigrationsメソッドを呼び出す必要があります。このコマンド
php 職人ベンダー:パブリッシュ --tag=passport-migrationsを使用して、デフォルトの移行をエクスポートできます。
デフォルトでは、Passport はフィールド「user_id」を使用してユーザーを識別します。別のフィールドを使用してユーザーを識別する場合 (例: uuid)、デフォルトのパスポート移行ファイルを変更できます。
フロントエンドによるクイックスタート
{note} Passport の Vue コンポーネントを使用するには、Vue JavaScript フレームワークを使用する必要があります。これらのコンポーネントは、Bootstrap CSS フレームワークも使用します。ただし、これらのツールを使用する予定がない場合、これらのコンポーネントは独自のフロントエンド コンポーネントを作成するのにも役立ちます。
Passport は、ユーザーがクライアント トークンと個人アクセス トークンを作成できるようにするために使用できる一連の JSON API を提供します。ただし、これらの API と対話するフロントエンド コードの作成には時間がかかる場合があります。したがって、Passport には、直接使用したり、独自のフロントエンドのリファレンスとして使用したりできる、プリコンパイルされた Vue コンポーネントも含まれています。
Passport の Vue コンポーネントを使用するには、
vendor:publish
Artisan コマンドを使用します:php artisan vendor:publish --tag=passport-components
公開されたコンポーネントは
resources/js/components ## に配置されます# コンテンツの下。コンポーネントが公開されたら、
resources/js/app.jsファイルにコンポーネントを登録する必要があります:
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} Laravel v5.7.19 より前では、「追加」で説明されています。コンポーネントを登録するときに「デフォルト」というエラーが発生すると、コンソール エラーが発生します。この変更の説明については、
コンポーネントを登録した後、必ずLaravel Mix v4.0.0 リリースノートを参照してください。
npm run dev
を実行してください。リソースを再コンパイルします。リソースを再コンパイルした後、コンポーネントをアプリのテンプレートに配置して、クライアント アクセス トークンと個人アクセス トークンの作成を開始できます:
<passport-clients></passport-clients> <passport-authorized-clients></passport-authorized-clients>< passport-personal-access-tokens></passport-personal-access-tokens>
デプロイPassportPassport を運用環境に初めて展開するときは、おそらくpassport:keys
コマンドを実行する必要があります。このコマンドは、Passport がアクセス トークンを生成するために必要なキーを生成します。生成されたキーは通常、バージョン管理に配置しないでください:
php artisan passport:keys
Passport::loadKeysFrom
メソッドを使用して、Passport キーの読み込みパスをカスタマイズできます:
/** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::loadKeysFrom('/secret-keys/oauth'); }
構成##トークンの有効期間デフォルトでは、Passport によって発行されたアクセス トークンは 1 年間有効です。ただし、アクセス トークンの有効期間をカスタマイズする場合は、
tokensExpireInメソッドと
refreshTokensExpireIn
メソッドを使用できます。上記 2 つのメソッドは、AuthServiceProvider
のboot
メソッドでも呼び出す必要があります:/** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::tokensExpireIn(now()->addDays(15)); Passport::refreshTokensExpireIn(now()->addDays(30)); }
デフォルト モデルをオーバーライドするPassport で使用されるモデルを自由に拡張し、
Passportクラス カスタム モデルを通じてデフォルト モデルを上書きできます:
use App\Models\Passport\Client; use App\Models\Passport\AuthCode; use App\Models\Passport\TokenModel; use App\Models\Passport\PersonalAccessClient; /** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::useClientModel(Client::class); Passport::useTokenModel(TokenModel::class); Passport::useAuthCodeModel(AuthCode::class); Passport::usePersonalAccessClientModel(PersonalAccessClient::class); }
アクセス トークンの発行
OAuth2 に精通している開発者は、OAuth2 の重要な部分が認可コードであることを知っている必要があります。認証コードを使用する場合、クライアント アプリケーションはユーザーをサーバーにリダイレクトし、クライアントへのアクセス トークンのリクエストを承認または拒否します。
クライアントの管理
まず、アプリケーション API と対話する必要があるアプリケーションを構築するために、開発者は次のことを行います。 「クライアント」を作成してアプリケーションを登録する必要があります。通常、これには、ユーザーのアプリケーションの名前と、ユーザーが承認リクエストを承認した後にアプリケーションがリダイレクトできる URL の提供が含まれます。
passport:client
コマンドクライアントを作成する最も簡単な方法は、Artisan コマンド
passport:client## を使用することです。 #, このコマンドを使用して、OAuth2 機能をテストするための独自のクライアントを作成できます。
clientコマンドを実行すると、Passport によってクライアントに関する情報の入力が求められ、最終的にクライアントの ID とシークレットが表示されます。
php artisan passport:client
リダイレクト URL
リダイレクト URL ホワイトリストが複数ある場合は、passport:client
コマンドで URL の入力を求めるプロンプトが表示されたときに、カンマ区切りを使用してそれらを指定できます。
http://example.com/callback,http://examplefoo.com/callback
{注} 任意の URLカンマを含むものはエンコードする必要があります。
JSON APIユーザーがクライアント コマンドを使用できないことを考慮して、Passport は「クライアント」の作成に使用できる JSON API を提供します。これにより、クライアントを作成、更新、削除するためのコントローラーの作成に時間を費やす必要がなくなります。 ただし、ユーザーにクライアント管理パネルを提供するには、Passport の JSON API に基づいてフロントエンド インターフェイスを開発する必要があります。以下に、クライアントの管理に使用されるすべての API をリストします。便宜上、ポートへの HTTP リクエストの作成を示すためにAxios を使用します。
この JSON API は、web
と
authという 2 つのミドルウェアによって保護されているため、アプリケーションからのみ呼び出すことができ、外部から呼び出すことはできません。
{ヒント} クライアント管理フロントエンド インターフェイス全体を自分で実装したくない場合は、
フロントエンドでのクイック スタート を使用して、完全に機能するインターフェイスを構築できます。フロントエンドインターフェイスは数分で完成します。
GET /oauth/clients
このルートは、認証されたユーザーのすべてのクライアントを返します。主な用途は、すべてのユーザーのクライアントをリストして編集または削除できるようにすることです:axios.get('/oauth/clients') .then(response => { console.log(response.data); });
POST /oauth/clients
このルートは、新しいクライアントを作成するために使用されます。クライアントの名前
name
と承認後のコールバック URLredirect
という 2 つのパラメーターが必要です。認可リクエストを承認または拒否した後、ユーザーはredirect
パラメータで指定されたリンクにリダイレクトされます。クライアントが作成されると、クライアントの ID とキーが返されます。クライアントはこれら 2 つの値を使用して、認可サービスからアクセス トークンをリクエストできます。このルートは新しいクライアント インスタンスを返します:
const data = { name: 'Client Name', redirect: 'http://example.com/callback'}; axios.post('/oauth/clients', data) .then(response => { console.log(response.data); }) .catch (response => { // 在response里列出错误详情... });
PUT /oauth/clients/{client-id}
このルートは次の目的で使用されます。クライアント情報を更新します。クライアントの名前
name
と承認後のコールバック URLredirect
という 2 つのパラメーターが必要です。ユーザーは、承認リクエストを承認または拒否した後、redirect
によってこのリンクにリダイレクトされます。このルートは更新されたクライアント インスタンスを返します: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 => { // 在response里列出错误详情... });
DELETE /oauth/clients/{client-id}
このルートは削除に使用しますクライアント:
axios.delete('/oauth/clients/' + clientId) .then(response => { // });
# 認可リダイレクト#のトークンをリクエストするとき
クライアントが作成された後、開発者はこのクライアントの ID とシークレットを使用して、アプリケーションから認証コードとアクセス トークンを要求します。まず、アプリケーションにアクセスするユーザーは、アプリケーションの
/oauth/authorizeルートにリダイレクト リクエストを送信します。例は次のとおりです:
{tip} このルートに注意してください。Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'code', 'scope' => '', ]); return redirect('http://your-app.com/oauth/authorize?'.$query); });
/oauth/authorize
は
Passport::routes
メソッドで定義されています。このルートを手動で定義する必要はありません。承認リクエスト承認リクエストを受信すると、Passport はユーザーにテンプレート ページを自動的に表示し、ユーザーが承認リクエストを承認または拒否できるようにします。 。ユーザーがリクエストを承認すると、アクセスしているアプリケーションによって指定された
redirect_uriにリダイレクトされます。
vendor:publishredirect_uri
は、クライアントの作成時に指定したredirect
リンクとまったく同じである必要があります。認証確認ページをカスタマイズする場合は、アーティザン コマンド
を使用してパスポート ビューを公開できます。パブリッシュされたビュー ファイルは、
に保存されます。resources/views/vendor/passport
:php artisan vendor:publish --tag=passport-views
認可コードをアクセス トークンに変換する
ユーザーが認可リクエストを承認すると、アクセスされたアプリケーションにリダイレクトされます。アクセスするアプリケーションは、
POST
リクエストを介してアプリケーションにアクセス トークンを要求する必要があります。リクエストには、ユーザーが認可リクエストを承認したときにアプリケーションによって発行される認可コードが含まれている必要があります。次の例では、Guzzle HTTP ライブラリを使用して、このPOST
リクエストを実装します。Route::get('/callback', function (Request $request) { $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); });
routing
/oauth/token
返される JSON レスポンスには # が含まれます。 #access_token、
refresh_token、および
expires_inプロパティ。
expires_inこの属性には、アクセス トークンの有効期限が秒単位で含まれます。
{ヒント}
#リフレッシュ トークンアプリケーションが有効期間の短いアクセス トークンを発行する場合、ユーザーは次のことを行う必要があります。アクセス トークンの発行時に提供されたリフレッシュ トークンを介してアクセス トークンをリフレッシュします。次の例では、Guzzle HTTP ライブラリを使用してトークンを更新します。/oauth/authorize
ルートと同様、
/oauth/tokenルートは
Passport::routes## にあります。 # メソッドが定義されているため、手動で定義する必要はありません。デフォルトでは、このルートはスロットリングに「ThrottleRequests」ミドルウェアの設定を使用します。
Route$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
OAuth2 パスワード認証メカニズムにより、モバイル アプリケーションなどの独自のクライアントがアクセス権を取得できるようになります。メールアドレスまたはユーザー名とパスワードを使用してトークンを取得します。この方法により、OAuth2 認証コード リダイレクト フロー全体を通過することなく、独自のクライアントにアクセス トークンを安全に発行できます。パスワード認証クライアントアプリケーションがパスワード認証メカニズムを通じてトークンを発行する前に、、## を含む JSON 応答を返します。 #refresh_token
およびexpires_in
プロパティ。expires_in
属性には、アクセス トークンの有効期限が秒単位で含まれます。passport:client
コマンドの後に--password
を追加します。 パスワード認証クライアントを作成するためのパラメータ。すでにpassport:install コマンドを実行している場合は、このコマンドを再度実行する必要はありません:
php artisan passport:client --password
トークンをリクエストする
パスワード付与クライアントを作成したら、ユーザーの電子メール アドレスを使用して
/oauth/token
ルートにPOST
を発行できます。とパスワードを要求してアクセストークンを取得します。ルートはPassport::routes
メソッドによって登録されているため、手動で定義する必要はありません。リクエストが成功すると、サーバーから返された JSON レスポンスでaccess_token
とrefresh_token
を受け取ります:$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} デフォルトでは、アクセス トークンは長期間有効です。 必要に応じて、アクセス トークンの有効期間を構成できます。
#すべてのスコープをリクエストパスワード認証メカニズムを使用する場合、スコープ パラメータをリクエストできます
*は、アプリケーションでサポートされているすべての範囲のトークンを承認します。リクエストにスコープ
# のパラメータが含まれている場合、トークン インスタンスの
can
メソッドは常にtrue
を返します。このスコープの承認は、パスワード
を使用して承認するときに発行されたトークンにのみ割り当てることができます:$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' => '*', ], ]);
カスタム ユーザー名フィールドパスワード認証を使用する場合、Passport はデフォルトで
emailを「ユーザー名」として使用します。ただし、モデルで
findForPassport
メソッドを定義することでユーザー名フィールドをカスタマイズできます:<?php namespace App; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use HasApiTokens, Notifiable; /** * 通过用户名找到对应的用户信息 * * @param string $username * @return \App\User */ public function findForPassport($username) { return $this->where('username', $username)->first(); } }
hidden Implicit認可トークン暗黙的な認可は認可コード認可に似ていますが、認可コードを交換せずにトークンをクライアントに返すだけです。この承認は、クライアントの資格情報を安全に保存できない JavaScript またはモバイル アプリケーションに最も一般的に使用されます。
AuthServiceProviderの
/oauth/authorizeenableImplicitGrant
メソッドを呼び出して、この認可を有効にします。
上記のメソッドを呼び出して認可を有効にすると、開発者はクライアント ID を使用して、次の認可にアクセスできるようになります。アプリケーション プログラムはアクセス トークンを要求します。接続されたアプリケーションは、以下に示すように、アプリケーションの/** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::enableImplicitGrant(); }
ルートにリダイレクト リクエストを行う必要があります。
{tip} 注:Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'token', 'scope' => '', ]); return redirect('http://your-app.com/oauth/authorize?'.$query); });
/oauth/authorize
ルートは
Passport::routes
メソッドですでに定義されているため、このルートを手動で再度定義する必要はありません。クライアント資格情報付与トークン
クライアント資格情報付与は、マシン間の認証に適しています。たとえば、この承認を使用して、API を通じてメンテナンス タスクを実行できます。
クライアント資格情報認証の前に、クライアント資格情報認証クライアントを作成する必要があります。
passport:client
コマンドの--client
パラメーターを使用して、次のものを作成できます。php artisan passport:client --client
次に、この承認を使用するには、まず
app/Http/Kernel.php
ファイルの$routeMiddleware
変数に新しいミドルウェアを追加する必要があります:use Laravel\Passport\Http\Middleware\CheckClientCredentials; protected $routeMiddleware = [ 'client' => CheckClientCredentials::class, ];
次に、このミドルウェアをルートに追加します。
Route::get('/orders', function (Request $request) { ... })->middleware('client');
ルートへのアクセスを特定のスコープに制限する場合は、
client
を追加します。ミドルウェアがルートに接続されている場合に必要なスコープの分離リスト:Route::get('/orders', function (Request $request) { ... })->middleware('client:check-status,your-scope');
を要求してトークン
を取得します。インターフェイスは次のメッセージを送信します。トークンを取得するリクエスト:
$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'];
パーソナル アクセス トークン
場合によっては、ユーザーは従来の認可コード リダイレクト プロセスを経ずに、自分自身にアクセス トークンを発行します。ユーザーがアプリケーション UI を通じて自分自身にトークンを発行できるようにすると、ユーザーが API を体験しやすくなったり、アクセス トークンを発行する簡単な方法として使用したりできます。
#Personal Access クライアントの作成アプリケーションが Personal Access トークンを発行する前に、次のことを行う必要があります。{note} 個人用アクセス トークンは永続的に有効であり、
tokensExpireIn
およびrefreshTokensExpireIn
メソッドが使用された場合でも、そのライフ サイクルは変更されません。passport:client
コマンドの後に
--personalパラメータを指定して、対応するクライアントを作成します。すでに
passport:installコマンドを実行している場合は、このコマンドを再度実行する必要はありません:
php artisan passport:client --personal
Personal Access クライアントをすでに作成している場合は、次のコマンドを呼び出して実行できます。AuthServiceProvider
メソッドで次を有効にします:
/** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::personalAccessClientId('client-id'); }
Manage Personal Access Token 個人用アクセス クライアントを作成した後、User
モデル インスタンスで
createTokenメソッドを使用して、特定のユーザーにトークンを発行できます。
createTokenメソッドは、トークンの名前を最初の引数として受け入れ、オプションの
scope 配列を 2 番目の引数として受け入れます:$user = App\User::find(1); // 创建没有作用域的访问令牌... $token = $user->createToken('Token Name')->accessToken; // 创建有作用域的访问令牌... $token = $user->createToken('My Token', ['place-orders'])->accessToken;
JSON API
Passport には個人アクセス トークンを管理するための JSON API もあり、これを独自のフロントエンドと組み合わせて、個人アクセス トークンを管理するためのダッシュボードをユーザーに提供できます。以下では、個人アクセス トークンを管理するためのすべての API インターフェイスについて説明します。便宜上、Axios を使用して、API インターフェースへの HTTP リクエストの作成を示します。
JSON API は
web
およびauth
ミドルウェアによって保護されているため、独自のアプリケーション内からのみ呼び出すことができます。外部ソースから呼び出すことはできません。{ヒント} 個人用アクセス トークン管理用に独自のフロントエンド インターフェイスを実装したくない場合は、フロントエンドのクイック スタートに従って、数分で完全に機能するフロントエンド インターフェイスが完成します。
GET /oauth/scopes
このルートは、アプリケーションで定義されているすべての scopes を返します。このルートを使用すると、ユーザーが個人アクセス トークンに割り当てられるスコープを一覧表示できます:
axios.get('/oauth/scopes') .then(response => { console.log(response.data); });
GET /oauth/personal-access-tokens
このルートは、認証されたユーザーによって作成されたすべての個人アクセス トークンを返します。これは主に、すべてのユーザーのトークンをリストして編集または削除できるようにするために使用されます:
axios.get('/oauth/personal-access-tokens') .then(response => { console.log(response.data); });
POST /oauth/personal-access-tokens
このルートは、新しい個人アクセス トークンを作成するために使用されます。これには、トークンの
name
とscpoe
の 2 つのデータが必要です: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}
このルートは、個人用アクセス トークンの削除に使用できます:axios.delete('/oauth/personal-access-tokens/' + tokenId);
# ルート保護ミドルウェア経由パスポートには、パスに渡されたアクセス トークンを検証できる検証保護メカニズムが含まれています。リクエストカード。
passportドライバーを使用するように
##アクセス トークンを渡すapi
のウォッチャーを構成したら、有効なアクセス トークンを必要とするルートでauth:api
ミドルウェアを指定するだけで済みます。Route::get('/user', function () { // })->middleware('auth:api');
##Passport で保護されたルートを呼び出す場合、アクセスされる API アプリケーションは、トークンは、リクエスト ヘッダーAuthorizationに
Bearerトークンとして配置されます。たとえば、Guzzle HTTP ライブラリを使用する場合:
$response = $client->request('GET', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken, ], ]);
#スコープをトークンに割り当てる#リクエスト認可コード#認可コードを使用してアクセス トークンをリクエストする場合、接続されたアプリケーションは、scopeパラメーターに必要なスコープを指定する必要があります。
scopeパラメーターに複数のスコープが含まれる場合は、スペースを使用して名前を区切ります。
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);});
個人用アクセス トークンの配布
使用Userモデルの
createTokenメソッドは個人アクセス トークンを発行します。必要なスコープの配列を 2 番目のパラメーターとしてこのメソッドに渡すことができます:
Passport には、受信リクエストに指定されたスコープにアクセスするためのトークンが含まれていることを確認するために使用できる 2 つのミドルウェアが含まれています。使用する前に、$token = $user->createToken('My Token', ['place-orders'])->accessToken;
app/Http/Kernel.phpファイルの$routeMiddleware
属性に次のミドルウェアを追加する必要があります:'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class, 'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
# # すべてのスコープの確認
ルートは、scopes
ミドルウェアを使用して、現在のリクエストに指定されたallスコープがあるかどうかを確認できます:
Route::get('/orders', function () { // Access token has both "check-status" and "place-orders" scopes... })->middleware('scopes:check-status,place-orders');
scopeミドルウェアを使用して、現在のリクエストに指定されたanyスコープがあるかどうかを確認できます:
Route::get('/orders', function () { // 访问令牌具有 "check-status" 或 "place-orders" 作用域... })->middleware('scope:check-status,place-orders');
トークン インスタンスのスコープを確認してください
アクセス トークンの検証を含むリクエストがアプリケーションによって認証された場合でも、現在の承認
User
## をトークン インスタンスで使用できます。インスタンス #tokenCanメソッドを使用して、トークンが指定されたスコープを持つことを確認します。
use Illuminate\Http\Request; Route::get('/orders', function (Request $request) { if ($request->user()->tokenCan('place-orders')) { // } });
scopeIds
メソッドは配列を返します。定義されたすべての ID/名前の:
Laravel\Passport\Passport::scopeIds();
scopes
このメソッドは、定義されたすべてのスコープの配列を含む
Laravel\Passport\Scopeインスタンスを返します:
Laravel\Passport\Passport::scopes();
scopesFor
メソッドは、指定された ID/名前に一致する
Laravel\Passport\Scopeインスタンスの配列を返します:
Laravel\Passport\Passport::scopesFor(['place-orders', 'check-status']);
を使用できます。 hasScope
メソッドは、指定されたスコープが定義されているかどうかを判断します。
Laravel\Passport\Passport::hasScope('place-orders');
#JavaScript を使用して APIにアクセスします。 # API を構築するときに、JavaScript アプリケーションを通じて独自の API にアクセスできると、開発プロセスに大きな利便性がもたらされます。 API 開発に対するこのアプローチにより、独自のアプリケーションの API と他のアプリケーションの共有 API を使用できるようになります。 Web アプリ、モバイル アプリ、サードパーティ アプリ、およびさまざまなパッケージ マネージャーで公開する SDK は、同じ API を使用する可能性があります。 通常、JavaScript アプリケーションで API を使用する場合は、アクセス トークンを手動で送信してアプリケーションに渡す必要があります。ただし、Passport にはこの問題を処理するミドルウェアがあります。CreateFreshApiToken
ミドルウェアをapp/Http/Kernel.php
ファイルの
webミドルウェア グループに追加するだけです:
'web' => [ // 其他中间件... \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ],
{ note} EncryptCookies
ミドルウェアがミドルウェア スタック内の
Cookie を追加します。この Cookie には、Passport が JavaScript アプリケーションからの API リクエストを認証するために使用する暗号化された JWT が含まれます。この時点で、アクセス トークンを明示的に渡さずにアプリケーションの API にリクエストを行うことができます。CreateFreshApiToken
laravel_tokenミドルウェアの前にリストされていることを確認する必要があります。
この Passport ミドルウェアは、すべてのアウトバウンド リクエストに
axios.get('/api/user') .then(response => { console.log(response.data); });
カスタム Cookie 名必要に応じて、## を使用できます。
AuthServiceProvider
のboot
メソッドの #Passport::cookie
メソッドを使用して、laravel_token
Cookie の名前をカスタマイズします。/** * 注册认证 / 授权服务 * * @return void */ public function boot(){ $this->registerPolicies(); Passport::routes(); Passport::cookie('custom_name'); }
CSRF 保護
この認証方法を使用すると、デフォルトの Laravel JavaScript スキャフォールディングにより、Axios はX-CSRF-TOKENと # を送信します。 ##X-Requested-With
リクエストヘッダー。さらに、HTML メタ タグ タグに CSRF トークンが含まれていることを確認する必要があります:// In your application layout... <meta name="csrf-token" content="{{ csrf_token() }}"> // Laravel's JavaScript scaffolding... window.axios.defaults.headers.common = { 'X-Requested-With': 'XMLHttpRequest', };
イベント
Passport は、アクセス トークンとリフレッシュ トークンが発行されるときにイベントをトリガーします。これらのイベントのリスナーをアプリケーションの
EventServiceProvider
に追加し、リスナー内の他のトークンを取り消したり変更したりできます:/** * 应用程序事件监听映射 * * @var array */ protected $listen = [ 'Laravel\Passport\Events\AccessTokenCreated' => [ 'App\Listeners\RevokeOldTokens', ], 'Laravel\Passport\Events\RefreshTokenCreated' => [ 'App\Listeners\PruneOldTokens', ], ];
##Test
Passport の
actingAs
メソッドでは、現在認証されているユーザーとそのスコープを指定できます。actingAs
メソッドの最初のパラメーターはユーザー インスタンスで、2 番目のパラメーターはユーザー トークン スコープの配列です。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); }