web-dev-qa-db-ja.com

常に「メッセージ」:「認証されていません。」 -Laravel Passport

私はこの日多くのチュートリアルを見つけました。そして、私のセットアップは、そこにあるすべての基本的なチュートリアルとまったく同じです。

現在、トークンを正常に返すことで、http://localhost/oauth/tokenにアクセスできます。

その後、ARC(Advanced Rest Client)を使用して、独自のAPIを呼び出すテストを行います。

私は次のようなヘッダーを渡しました

Authorization: Bearer the_token_here
accept: application/json

そのヘッダーから、laravel /user。]によって提供されるデフォルトのAPIにアクセスしたかっただけです。

しかし、私は常に{ "message": "Unauthenticated." }の応答を得ました

このチュートリアルを参照してください https://itsolutionstuff.com/post/laravel-5-how-to-create-api-authentication-using-passport-example.html

チュートリアルに従ってログインできますが、エンドポイントdetailsでデータを取得できません。 { "message": "Unauthenticated." }の応答を返します

api.phpの私のルート

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

ところで、laravel.logにエラーメッセージはなく、デバッグモードに設定していました

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))
5
Kasnady

原因の詳細なエラーメッセージを取得するには、以下のようにCheckClientCredentialsクラスの詳細に移動する必要があります

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);
}

エラーメッセージに基づきます。私の質問で。

解決策は、これを(パブリックフォルダー内だけでなく)ルートフォルダーの.htaccessに追加することです

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

公式文書にも注記があります ここを参照

上記の構成がない場合、Authorizationヘッダーはどこからでもアプリへの呼び出し中に無視されます。無視されると、内部クラスはこのヘッダーデータを取得できません

5
Kasnady

すべてを試してもうまくいかない場合は、設定キャッシュをクリアしてみてください。パスポートの再インストール、2億回のチュートリアル、テストプロジェクトの作成などに2日間を費やし、最終的にはキャッシュをクリアする必要があることに気付きました。

php artisan config:cache

2
Savlon

誰かが同じ問題を抱えていて、選択した解決策で解決できない場合。以下を確認してください。

1)要求のヘッダーでX-CSRF-TOKENを送信していることを確認します。私の場合、vue with axiosを使用して:

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

送信する場合は、vendor/laravel/passport/src/Passport.php行125で次の値を変更してみてください(変更される場合があります)

TrueからFalse

public static $unserializesCookies = false;

問題は https://github.com/laravel/passport/issues/452 の問題に類似している可能性があります

シリアル化に関する説明は、問題にあります

更新01/02/2020

Zac Griersonがコメントしたように、ベンダーファイルは次のように変更されるため変更しないでください。

作曲家の更新

mickspより良いsolutionが見つかりました: "added static $ serialize = false; app/Http/Middleware/EncryptCookies.phpに追加します。その後、ブラウザのCookieを削除します。 "

0
Emitate