Laravel Passportを使ったOauthサーバ その2
今回はLaravel Passportを使ったOauthサーバの続きです。
認証設定
今回はクライアント認証するようにします。
クライアント認証利用設定
★追記★の1行をapp/Http/Kernel.phpに追加します。
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'client' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class, ★追記★ ];
ルーティングの設定
どの機能(URL)に認証を掛けるのかをroutes/api.phpに設定します。
今回はグループ設定でやってみました。
use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\ApplicantController; ★追加 /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- | | Here is where you can register API routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | is assigned the "api" middleware group. Enjoy building your API! | */ Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); ★以下追加 Route::group(['middleware' => 'auth'], function () { Route::get('/applicant/{id}', [ApplicantController::class, 'show']); });
テスト用のサーバ機能の作成
簡単な機能を作って認証が動くか確かめてみます。
今回はREST APIを想定してGETでもらったIDを返却するだけの簡単な機能を実装します。
テンプレートの作成
まずController作ります。
$ php artisan make:controller ApplicantController
実装
テンプレートに実装します。
namespace App\Http\Controllers; use Illuminate\Http\Request; #use App\Applicant; class ApplicantController extends Controller { # ID表示 public function show(Int $id) { $post = "id:$id"; return response()->json($post); } }
使ってみる
curlで動くか試してみます。
tokenは前回取得したtokenを使います。
tokenはどうやって送るかというとヘッダ情報の中に入れて送ります。
無事に認証が通ってURLの最後に入れたID(3)が表示されました。
$ curl -verbose -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiN........' http://localhost:8000/api/applicant/3 Note: Unnecessary use of -X or --request, GET is already inferred. * Trying 127.0.0.1:8000... * Connected to localhost (127.0.0.1) port 8000 (#0) > GET /api/applicant/ HTTP/1.1 > Host: localhost:8000 > User-Agent: curl/7.79.1 > Referer: rbose > Content-Type: application/json > Accept: application/json > Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiN........ > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Host: localhost:8000 < Date: Wed, 12 Oct 2022 03:34:51 GMT < Connection: close < X-Powered-By: PHP/8.0.20 < Cache-Control: no-cache, private < Date: Wed, 12 Oct 2022 03:34:51 GMT < Content-Type: application/json < X-RateLimit-Limit: 60 < X-RateLimit-Remaining: 59 < Access-Control-Allow-Origin: * < * Closing connection 0 "id:3"
ここでtokenが間違っていて認証が失敗すると401が帰ってきます。
* Mark bundle as not supporting multiuse < HTTP/1.1 401 Unauthorized < Host: localhost:8000 < Date: Mon, 24 Oct 2022 06:06:00 GMT < Connection: close < X-Powered-By: PHP/8.0.20 < Cache-Control: no-cache, private < Date: Mon, 24 Oct 2022 06:06:00 GMT < Content-Type: application/json < X-RateLimit-Limit: 60 < X-RateLimit-Remaining: 57 < Access-Control-Allow-Origin: * < * Closing connection 0 {"message":"Unauthenticated."}
何を設定するかがわかれば後は本当に簡単。皆様もお試しください。