Ich hatte an diesem ganzen Tag viele Anleitungen gefunden. Und mein Setup ist genau das gleiche wie das grundlegende Tutorial da draußen.
Derzeit kann ich auf http://localhost/oauth/token
zugreifen, wobei das Token erfolgreich an mich zurückgegeben wurde.
Danach benutze ich ARC (Advanced Rest Client), um zu testen, wie ich meine eigene API anrufe.
Ich hatte Header wie zB übergeben
Authorization: Bearer the_token_here
accept: application/json
Von diesem Header wollte ich nur auf die Standard-API zugreifen, die von laravel /user
bereitgestellt wird.
Aber ich bekam immer Antwort von { "message": "Unauthenticated." }
Lesen Sie dieses Tutorial https://itsolutionstuff.com/post/laravel-5-how-to-create-api-authentication- using-passport-example.html
Ich kann mich per Tutorial anmelden, aber ich kann keine Daten über den Endpunkt details
abrufen. Es gibt Antwort von { "message": "Unauthenticated." }
zurück.
Meine Route von api.php
Route::group(['prefix' => 'v1', 'middleware' => 'auth:api'], function(){
Route::get('/user', function( Request $request ){
return $request->user();
});
});
Es gibt übrigens keine Fehlermeldung in laravel.log und ich hatte den Debug-Modus eingestellt
UPDATE Danke an Kommentar von 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))
Um eine detaillierte Fehlermeldung über die Ursachen zu erhalten, müssen Sie wie unten beschrieben zu CheckClientCredentials
Klassendetails gehen
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);
}
Basierend auf der Fehlermeldung. in meiner Frage.
Die Lösung fügt dies zu .htaccess
des Stammordners hinzu (nicht nur innerhalb des Öffentlichen Ordners)
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Ohne die oben genannte Konfiguration wird der Authorization
-Header während des Aufrufs von einer beliebigen Stelle zur App ignoriert. Nach dem Ignorieren kann die Klasse diese Kopfdaten nicht innerhalb der Klasse abrufen
Falls jemand dasselbe Problem hat und die gewählte Lösung das Problem nicht löst. Überprüfe das Folgende:
1) Prüfen Sie, ob Sie den X-CSRF-TOKEN im Header der Anforderung senden. In meinem Fall verwende ich vue mit axios:
let token = window.$('meta[name="csrf-token"]').attr('content');
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token;
Wenn Sie es senden, ändern Sie den folgenden Wert in Vendor/Laravel/Passport/src/Passport.php Zeile 125 (kann sich ändern)
Von wahr bis falsch
public static $unserializesCookies = false;
Das Problem ähnelt möglicherweise dem in https://github.com/laravel/passport/issues/452
Eine Erklärung zur Serialisierung finden Sie in der Ausgabe