web-dev-qa-db-ja.com

Laravel Passport Routeはログインページにリダイレクトします

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');
14
Keith

定義されたログインルートへのリダイレクトは、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メソッドのセットアップ方法に関する厄介なものか.

とにかく、これはログインページにリダイレクトされるという問題を解決しますが、それは基礎となる認証が機能していないサインです

33
madz

郵便配達員のヘッダーにこのコードを追加します。

key           Value
Accept        application/json
4

すべてのリクエストのヘッダーにAuthorization: Bearer YOUR_TOKENを追加する必要があります。また、最新バージョンの場合Laravel 5.5以上。ヘッダーをリクエストするにはAccept: application/jsonも追加する必要があります。

4
Edwin Wong

リクエストがAjaxからのものかどうかをチェックするようにコーディングされています。その場合、認証に失敗すると次のjsonを受け取ります。

{
"error": "Unauthenticated."
}

それ以外の場合は、ブラウザを使用していると見なされ、認証のためにHTMLログインページにリダイレクトされます。

次のヘッダーをリクエストに追加して、Ajaxリクエストをシミュレートできます。

X-Requested-With = XMLHttpRequest
3
wmac

資格情報に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」ミドルウェアを追加します。

0
mwangaben