LaravelプロジェクトでPassportトークン認証を使用するように構成しています。すべてが機能しているようですが、_auth:api
_ミドルウェアが失敗すると、クライアントは_200
_と応答本文のHTMLの束ではなく、_401
_のステータスで応答してほしい。
Laravel Passportのソースまたはこのようなことを行うためのドキュメントに何も見つかりません。ミドルウェアのソースすら見つかりません。
私のテストルート:
_Route::get('/protected', function () {
return response()->json([
'success' => true
]);
})->middleware('auth:api');
_
config/auth.php
_'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'appUsers',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'appUsers' => [
'driver' => 'eloquent',
'model' => App\Models\AppUser::class
],
],
_
このヘッダーをリクエストと共に送信することで解決できます。
Accept : application/json
これは、このメッセージを401
ステータスコード。
{
"message": "Unauthenticated."
}
ユーザーが認証しない場合、LaravelはAuthenticationException
をスローします。
この例外は _Illuminate/Foundation/Exceptions/Handler.php
_ のrender
メソッドによって処理され、次に定義されているunauthenticated()
メソッドを呼び出します _app/Exceptions/Handler.php
_ :
_protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('login'));
}
_
ご覧のとおり、デフォルトでは、リクエストがJSONレスポンスを期待している場合、JSONエラー本文を含む401が返されます。リクエストがJSONを想定していない場合、リクエストはログインページにリダイレクトされます。
expectsJson()
メソッドは、リクエストに_Accept: application/json
_ヘッダーまたは_X-Requested-With: XMLHttpRequest
_のいずれかが含まれている場合にtrueを返します。 _Accept: application/json
_ヘッダーはAPI呼び出しに適していますが、_X-Requested-With: XMLHttpRequest
_ヘッダーはajax呼び出しに使用されます。
したがって、アプリケーションコードを変更せずに、リクエストに_Accept: application/json
_ヘッダーが含まれていることを確認してください。
ただし、ユーザーが認証されていないときに別のアクションを実行する必要がある場合は、_app/Exceptions/Handler.php
_のこのunauthenticated()
メソッドを変更できます。
_protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
// return a plain 401 response even when not a json call
return response('Unauthenticated.', 401);
}
_
ミドルウェアでは、次のように返すことができます:
return abort(401);