Laravel では、従来のフォームに基づいてログインと承認を実装するのは非常に簡単ですが、API シナリオで承認要件を満たすにはどうすればよいでしょうか? API シナリオでは、通常、ユーザー認証はリクエスト間のセッション状態を維持するのではなく、トークンを通じて実装されます。 Passport を使用して、Laravel プロジェクトに API 認証プロセスを簡単に実装できるようになりました。Passport を使用すると、完全な OAuth2 サーバー実装を数分でアプリケーションに追加できます。
Composer 依存関係パッケージ マネージャーを使用して Passport をインストールします:
composer require laravel/passport
次に、構成ファイル config/app.php:
Laravel\Passport\PassportServiceProvider::class
のプロバイダー配列に Passport サービス プロバイダーを登録します。サービス プロバイダーは内部データベース移行スクリプト ディレクトリを登録するため、前の手順が完了した後、データベース構造を更新する必要があります。パスポートの移行スクリプトは、アプリケーションに必要なクライアント データ テーブルとトークン データ テーブルを自動的に作成します:
php artisan migrate
次に、passport:install コマンドを実行して、セキュア アクセス トークンの生成に使用される暗号化キーを作成する必要があります。このコマンドは、「プライベート アクセス」クライアントと「パスワード認証」クライアントも作成します:
php artisan passport:install
上記のコマンドを実行した後、AppUser.php を変更して、認証されたユーザー ドメインのトークンと使用状況を確認します:
<?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; // 增加 HasApiTokens
次に、AuthServiceProvider のブート メソッドで Passport::routes 関数を呼び出す必要があります。この関数は、アクセス トークン、クライアント、およびプライベート アクセス トークンの発行および失効プロセスで使用されるいくつかの必要なルートを登録します。
AppProvidersAuthServiceProvider.php を変更します:
<?php namespace App\Providers;use Laravel\Passport\Passport; // 新增use Illuminate\Support\Facades\Gate;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;use Carbon\Carbon; // 新增引用class AuthServiceProvider extends ServiceProvider {/** * The policy mappings for the application. * * @var array */protected $policies = ['App\Model' => 'App\Policies\ModelPolicy',];/** * Register any authentication / authorization services. * * @return void */public function boot() {$this->registerPolicies(); Passport::routes(); // 注册passport路由 //令牌的有效期Passport::tokensExpireIn(Carbon::now()->addDays(15)); Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); } }
最後に、構成ファイル config を変更する必要があります。 / auth.phpのAPI部分の認可保護項目(ドライバー)をパスポートに変更します。この調整により、アプリケーションは API から認可リクエストを受信したときに Passport の TokenGuard を使用するようになります:
'guards' => ['web' => ['driver' => 'session', 'provider' => 'users',], 'api' => ['driver' => 'passport', // 改为passport'provider' => 'users',],],
api のルートは api.php です。 Routeapi.php を開き、テスト ルートを追加します。
Route::group(['namespace' => 'api'], function () { Route::post('/login', 'UserController@login'); }); Route::group(['middleware' => 'auth:api', 'namespace' => 'api'], function() { Route::get('details', 'UserController@details'); });
1 つはログインしてトークンを取得するために使用され、もう 1 つは取得したトークンでログイン認証を完了し、現在のユーザー情報を取得するために使用されます。
詳細ルーティングは、auth:api ミドルウェアを使用してトークンを検証します。
AppHttp ディレクトリに API フォルダーを作成し、UserController.php を追加します
<?php namespace App\Http\Controllers\api;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Auth;use App\User;use Response;class UserController extends Controller {public function __construct() {$this->content = array(); }public function login() {if(Auth::attempt(['email' => request('email'), 'password' => request('password')])) {$user = Auth::user();$this->content['token'] = $user->createToken('Pizza App')->accessToken;$status = 200; } else {$this->content['error'] = "未授权"; $status = 401; } return response()->json($this->content, $status); }public function details() {return response()->json(['user' => Auth::user()]); } }
postman でテストします:
上の図に示すように、ログイン メソッドはルートと一致し、post メソッドを使用し、送信する必要がありますユーザーをフォームに入力し、メールアドレスとパスワードを api/login に渡します
正しく渡された場合、上の図のトークンを取得します
前のステップで取得したトークンをヘッダーに追加しますそれをトークン「Bearer」の前に追加します。その後、現在のユーザーの情報を取得できます。つまり、ユーザ認証が完了する。
上記は完全に正しいという保証はありません。私の GitHub コードをご覧いただきありがとうございます。
以上がAPI シナリオで承認要件を満たすにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。