Laravel 5.3&Passportを使用しています。
Postmanを使用してapi.phpファイルに設定したルートをテストすると、常にログインページが返されます。これが私のテストルートの例です。
Route::get('/getKey', function() {
return 'hello';
})->middleware('client_credentials');
郵便配達員のパラメータ:
Accept application/json
Authorization Bearer <then my key>
答えを探している間に見つけた別のソリューションごとに、ミドルウェアを「auth:api」に設定しました。
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('auth:api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
私は他の人のために働いたすべての解決策について試しましたが、それでも運はありません。どんな提案も大歓迎です。
更新だから、ようやく機能するようになりました。コンシューマーアプリを作成し、いくつかのテスト関数を作成しました。トークンの検証でAPIを使用できました。ただし、このルートを押してもログインページは返されなくなりましたが、代わりに何も返されなくなりました。そのため、何らかの理由でまだ機能していません。
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('client_credentials');
定義されたログインルートへのリダイレクトは、app\Exceptions\Handler.phpクラスで発生しています。
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('login'));
}
この関数は、APIから呼び出されているかどうかを検出しようとします(この場合、JSONメッセージで401 Unauthorized応答を返します)。そうでない場合は、コメントに従ってログインページにリダイレクトします。
認証例外を認証されていない応答に変換します
Postmanで問題を解決するには、リクエストで[ヘッダー]タブをクリックし、以下を追加します。
key: Accept
value: application/json
私はこれにかなり慣れていないので、これがPostmanですべてのAPI呼び出しをテストするときに追加するヘッダーなのか、これがlaravelメソッドのセットアップ方法に関する厄介なものか.
とにかく、これはログインページにリダイレクトされるという問題を解決しますが、それは基礎となる認証が機能していないサインです
郵便配達員のヘッダーにこのコードを追加します。
key Value
Accept application/json
すべてのリクエストのヘッダーにAuthorization: Bearer YOUR_TOKEN
を追加する必要があります。また、最新バージョンの場合Laravel 5.5以上。ヘッダーをリクエストするにはAccept: application/json
も追加する必要があります。
リクエストがAjaxからのものかどうかをチェックするようにコーディングされています。その場合、認証に失敗すると次のjsonを受け取ります。
{
"error": "Unauthenticated."
}
それ以外の場合は、ブラウザを使用していると見なされ、認証のためにHTMLログインページにリダイレクトされます。
次のヘッダーをリクエストに追加して、Ajaxリクエストをシミュレートできます。
X-Requested-With = XMLHttpRequest
資格情報にusername
の代わりにemail
を使用している場合; User
モデルにこのメソッドを挿入します:
function findForPassport($username) {
return $this->where('username', $username)->first();
}
ここに問題があるのは、これらのコード行からです
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('auth:api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
アイマーク
->middleware('auth:api')
「auth:api」ミドルウェアにはキーワードAUTH ===認証済みユーザーが含まれているため、認証済みユーザーを必要としないものであっても、このミドルウェア下のすべての要求が発生します
そのため、郵便配達員がauth:apiの下のルートにリクエストを行うと、最初に認証のためのログインページにリダイレクトされます(最初にログインするため)
したがって、アプリの設計とセキュリティに従って認証されたユーザーを必要とするルートにauth:apiミドルウェアを使用することをお勧めします
Http/kernel.phpファイルに「auth:api」がある場合
'api' => [
'throttle:60,1',
'bindings',
'auth:api"
],
そして、あなたはSPAを設計し、すべてのルートはroutes/api.php上にあります。ログイン/サインアップページに到達しても、奇妙な認証されたユーザーが必要です。
必要に応じて「auth:api」ミドルウェアを追加します。