web-dev-qa-db-ja.com

Laravel and Passport?

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
    ],
],
_
8
SimpleJ

このヘッダーをリクエストと共に送信することで解決できます。

Accept : application/json

これは、このメッセージを401ステータスコード。

{
    "message": "Unauthenticated."
}
20
Ariful Haque

ユーザーが認証しない場合、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);
}
_
9
patricus

ミドルウェアでは、次のように返すことができます:

return abort(401);
3