J'ai donc configuré mon API avec Passport et j'ai essayé de faire une requête GET pendant près d'une semaine maintenant, mais j'ai toujours la réponse ci-dessous:
public static function tokensExpireIn(DateTimeInterface $date = null) { if (is_null($date)) { return static::$tokensExpireAt ? Carbon::now()->diff(static::$tokensExpireAt) : new DateInterval('P1Y'); } static::$tokensExpireAt = $date; return new static; }
Voici ma configuration:
Auth.php
# Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
public function callback(Request $request) { $http = new Client(); $token_url=url('oauth/token'); $response = $http->post($token_url, [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => $this->client_id, 'client_secret' => $this->client_secret, 'username'=>'my-username', 'password'=>'my-password', 'scope' =>'*', ], ]); return json_decode((string) $response->getBody(), true); }
protected function mapApiRoutes() { Route::prefix('api') ->middleware('auth:api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
3 Réponses :
Essayez de créer un nouveau client d'octroi de mot de passe avec:
What should we name the password grant client? [Laravel Password Grant Client]: > Password grant client created successfully. Client ID: 4 Client secret: WlRYEbA5lt5esbi0MuFyJPzPDmHDGsk3iC5QGw7d
Vous obtiendrez un résultat comme:
php artisan passport:client --password
Utilisez ces informations d'identification pour remplissez votre identifiant client et votre secret. Les informations d'identification client standard créées via l'interface du composant Vue ne fonctionnent pas pour les octrois de mot de passe.
Exactement ce que j'ai fait @matticistard. J'ai fini par créer mon propre middleware pour authentifier mes demandes.
Le problème est de savoir comment vous vous authentifiez et quel jeton vous utilisez.
Il y a 2 façons de générer un jeton
Maintenant, dans les routes API, vous devez dire dans votre méthode comment vous vous authentifiez par exemple
// Below one is for the User token Route::get('/test', 'Api\TestController@index')->middleware('auth:api');
// Below one is for authenticating Client token Route::get('/test', 'Api\TestController@index')->middleware('client_credentials');
Et n'oubliez pas si vous utilisez l'authentification client, vous devez ajouter la ligne ci-dessous dans routemiddleware
dans App / http / kernel.php
'client_credentials '=> \ Laravel \ Passport \ Http \ Middleware \ CheckClientCredentials :: class
J'espère que cela résout les problèmes
essayez de commenter les middlewares dans le groupe de middlewares api (app / HTTP / Kernel.php)
protected function mapApiRoutes() { Route::prefix('api') // ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
Ou commentez le groupe de middlewares api dans app / Providers / RouteServiceProvider.php
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ], 'api' => [ // 'throttle:60,1', // \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];