ホームページ  >  記事  >  バックエンド開発  >  API シナリオで承認要件を満たすにはどうすればよいですか?

API シナリオで承認要件を満たすにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-06-23 11:46:451561ブラウズ

はじめに

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 = [&#39;App\Model&#39; => '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',],],

Test

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。