私はこの日多くのチュートリアルを見つけました。そして、私のセットアップは、そこにあるすべての基本的なチュートリアルとまったく同じです。
現在、トークンを正常に返すことで、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))
原因の詳細なエラーメッセージを取得するには、以下のように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
ヘッダーはどこからでもアプリへの呼び出し中に無視されます。無視されると、内部クラスはこのヘッダーデータを取得できません
すべてを試してもうまくいかない場合は、設定キャッシュをクリアしてみてください。パスポートの再インストール、2億回のチュートリアル、テストプロジェクトの作成などに2日間を費やし、最終的にはキャッシュをクリアする必要があることに気付きました。
php artisan config:cache
誰かが同じ問題を抱えていて、選択した解決策で解決できない場合。以下を確認してください。
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を削除します。 "