web-dev-qa-db-fra.com

Laravel Passport Route redirige vers la page de connexion

J'utilise Laravel 5.3 & Passport.

Lorsque vous utilisez Postman pour tester un itinéraire que j'ai défini dans le fichier api.php, il renvoie toujours la page de connexion. Voici un exemple de mon parcours de test:

Route::get('/getKey', function() {
    return 'hello';
})->middleware('client_credentials');

Postman params:

Accept application/json
Authorization Bearer <then my key>

J'ai réglé le middleware sur 'auth: api' selon une autre solution trouvée lors de la recherche de la réponse.

protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('auth:api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }

J'ai essayé à peu près toutes les solutions qui ont fonctionné pour les autres mais toujours pas de chance. Toute suggestion serait très appréciée.

UPDATEAlors j'ai finalement eu quelque chose à travailler. J'ai créé une application grand public et créé quelques fonctions de test. J'ai pu consommer l'api, avec vérification de jeton. Cependant, cliquer sur cette route ne renvoie plus ma page de connexion, mais ne renvoie plus rien. Donc, cela ne fonctionne toujours pas pour une raison quelconque.

Route::get('/user', function (Request $request) {

    return $request->user();
})->middleware('client_credentials');
8
Keith

La redirection vers la route de connexion définie a lieu dans la classe app\Exceptions\Handler.php. 

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

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

La fonction essaie de détecter si elle est appelée depuis une API (le cas échéant, elle renvoie une réponse non autorisée 401 avec un message JSON) et, dans le cas contraire, elle sera redirigée vers la page de connexion en fonction des commentaires.

Convertit une exception d'authentification en une réponse non authentifiée

Pour résoudre le problème dans postman, sur la demande, cliquez sur l'onglet En-têtes et ajoutez:

key:   Accept
value: application/json

Comme je suis assez novice dans ce domaine, je ne sais pas s'il s'agit d'un en-tête que nous devrions ajouter lors du test de tous les appels d'API avec Postman ou simplement d'une connaissance de la façon dont cette méthode laravel est configurée.

Quoi qu'il en soit, cela résoudrait le problème de votre redirection vers la page de connexion. Toutefois, cela signifierait que votre authentification sous-jacente ne fonctionne pas.

20
madz

Ajoutez ce code sur les en-têtes sur le postier.

key           Value
Accept        application/json
3
Bijaya Kumar Oli

Il est codé pour vérifier si la requête provient d’Ajax. Dans ce cas, vous recevrez le JSON suivant si l’authentification échoue:

{
"error": "Unauthenticated."
}

Sinon, vous utiliserez un navigateur et il sera redirigé vers la page de connexion HTML pour l'authentification.

Vous pouvez ajouter l'en-tête suivant à votre demande pour simuler une demande Ajax:

X-Requested-With = XMLHttpRequest
3
wmac

Vous devez ajouter Authorization: Bearer YOUR_TOKEN à l'en-tête de chaque requête. Aussi, pour la dernière version Laravel 5.5 ou supérieure. Vous devez également ajouter Accept: application/json pour demander un en-tête.

1
Edwin Wong

si vous utilisez username au lieu de email pour les informations d'identification; insérez cette méthode dans votre modèle User:

function findForPassport($username) {
     return $this->where('username', $username)->first();
}