web-dev-qa-db-fra.com

Toujours eu "message": "Unauthenticated". - Laravel Passeport

J'ai trouvé de nombreux tutoriels toute la journée. Et ma configuration est exactement la même que celle de tous les tutoriels de base.

Actuellement, je peux accéder à http://localhost/oauth/token avec un jeton de retour réussi.

Après cela, j'utilise ARC (Advanced Rest Client) pour tester l'appel de ma propre API.

J'avais passé l'en-tête tel que

Authorization: Bearer the_token_here
accept: application/json

À partir de cet en-tête, je voulais simplement accéder à l'API par défaut fournie par laravel /user.

Mais j'ai toujours eu la réponse de { "message": "Unauthenticated." }

Référez-vous à ce tutoriel https://itsolutionstuff.com/post/laravel-5-how-to-create-api-authentication-using-passport-example.html

Je suis capable de me connecter conformément au tutoriel, mais je ne parviens pas à obtenir les données par noeud final details. Il retourne la réponse de { "message": "Unauthenticated." }

Mon itinéraire de api.php

Route::group(['prefix' => 'v1', 'middleware' => 'auth:api'], function(){
    Route::get('/user', function( Request $request ){
        return $request->user();
    });
});

À propos, il n'y a pas de message d'erreur dans laravel.log et j'avais mis en mode Debug

UPDATE Merci à Commentaire de Mayank

League\\OAuth2\\Server\\Exception\\OAuthServerException: The resource owner or authorization server denied the request. in /.../vendor/league/oauth2-server/src/Exception/OAuthServerException.php:173
Stack trace:
#0 /.../vendor/league/oauth2-server/src/AuthorizationValidators/BearerTokenValidator.php(59): League\\OAuth2\\Server\\Exception\\OAuthServerException::accessDenied('Missing "Author...')
#1 /.../vendor/league/oauth2-server/src/ResourceServer.php(82): League\\OAuth2\\Server\\AuthorizationValidators\\BearerTokenValidator->validateAuthorization(Object(Zend\\Diactoros\\ServerRequest))
#2 /.../vendor/laravel/passport/src/Http/Middleware/CheckClientCredentials.php(46): League\\OAuth2\\Server\\ResourceServer->validateAuthenticatedRequest(Object(Zend\\Diactoros\\ServerRequest))
3
Kasnady

Pour obtenir un message d'erreur détaillé sur les causes, vous devez accéder à CheckClientCredentials class detail comme ci-dessous.

public function handle($request, Closure $next, ...$scopes)
{
    $psr = (new DiactorosFactory)->createRequest($request);

    try {
        $psr = $this->server->validateAuthenticatedRequest($psr);
    } catch (OAuthServerException $e) {
        error_log($e->getHint()); // add this line to know the actual error
        throw new AuthenticationException;
    }

    $this->validateScopes($psr, $scopes);

    return $next($request);
}

Basé sur le message d'erreur. dans ma question.

La solution ajoute ceci à .htaccess du dossier racine (pas seulement à l'intérieur du dossier public).

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Sans la configuration ci-dessus, l'en-tête Authorization sera ignoré pendant l'appel de n'importe où vers l'application. Une fois ignoré, l'intérieur de la classe ne pourra pas récupérer ces données d'en-tête

2
Kasnady

Au cas où quelqu'un aurait le même problème et que la solution choisie ne le résolve pas. Vérifiez les points suivants:

1) Vérifiez que vous envoyez le X-CSRF-TOKEN dans l'en-tête de la demande. Dans mon cas, j'utilise vue avec axios:

let token = window.$('meta[name="csrf-token"]').attr('content');
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token;

Si vous l'envoyez, essayez de modifier la valeur suivante dans vendor/laravel/passport/src/Passport.php ligne 125 (peut changer)

De True à False

public static $unserializesCookies = false;

Le problème peut être similaire à celui de https://github.com/laravel/passport/issues/452

Une explication sur la sérialisation est dans le numéro

0
Emitate