web-dev-qa-db-fra.com

Répondez avec le code d'état 401 en cas d'échec de l'authentification en utilisant Laravel et Passport?

Je configure un projet Laravel pour utiliser l'authentification par jeton Passport. Tout semble fonctionner, mais lorsque le auth:api le middleware échoue, il répond au client avec un état de 200 et un tas de code HTML dans le corps de la réponse. Au lieu de cela, je veux qu'il réponde avec un statut de 401.

Je ne trouve rien dans la source Laravel Passport ou la documentation sur la façon de faire quelque chose comme ça. Je ne trouve même pas la source du middleware.

Mon parcours de test:

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

Vous pouvez le résoudre en envoyant cet en-tête avec votre demande.

Accept : application/json

Cela enverra ce message avec 401 code d'état.

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

Si un utilisateur ne s'authentifie pas, Laravel lancera un AuthenticationException.

Cette exception est gérée par la méthode render dans Illuminate/Foundation/Exceptions/Handler.php , et appellera à son tour la méthode unauthenticated() qui est définie dans votre - app/Exceptions/Handler.php :

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

Comme vous pouvez le voir, par défaut, si la demande attend une réponse JSON, vous obtiendrez un 401 avec un corps d'erreur JSON. Si la demande n'attend pas JSON, la demande est redirigée vers la page de connexion.

La méthode expectsJson() renverra true si votre demande a soit l'en-tête Accept: application/json, Soit X-Requested-With: XMLHttpRequest. L'en-tête Accept: application/json Est plus approprié pour les appels api, tandis que l'en-tête X-Requested-With: XMLHttpRequest Est utilisé pour les appels ajax.

Donc, sans changer aucun de votre code d'application, assurez-vous simplement que les demandes incluent l'en-tête Accept: application/json.

Cependant, si vous avez besoin qu'une action différente se produise lorsqu'un utilisateur n'est pas authentifié, vous pouvez modifier cette méthode unauthenticated() dans app/Exceptions/Handler.php:

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

Dans le middleware, vous pouvez retourner comme ceci:

return abort(401);
3
Serdar Saygılı