web-dev-qa-db-ja.com

laravel Webページでトークン認証を使用する方法

セッションの代わりにlaravel WebページにJWTを使用しようとしているので、いくつか変更を加えました。

  1. インストール済み jwt-auth および configure

  2. 次に、config /auth.phpでデフォルトのガードをapiに変更しました

    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],
    
    'guards' => [
        ...
    
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    

今私はエラーが発生しています

(1/1)FatalErrorExceptionAuthenticatesUsers.phpの未定義メソッドIlluminate\Auth\TokenGuard :: attempt()の呼び出し(75行目)

これを修正し、laravel Webページ(APIではなくブレード)のトークン認証を開始する方法。

11
Rishi Raut

ここで解決策を見つけました: https://github.com/tymondesigns/jwt-auth/issues/86

/routes/api.phpに-いくつかの基本認証ルートを追加しました

Route::post('login', 'Auth\LoginController@login');

Route::get('/user', function (Request $request) {
    $user = $request->user();
    return dd($user);
})->middleware('auth:api');

/app/http/Controller/auth/LoginController.php内

次に、ログインコントローラーのメソッドをオーバーライドします

public function login(Request $request)
{
    $credentials = $request->only(["email","password"]);
    if ($token = $this->guard()->attempt($credentials)) {
        return $this->sendLoginResponse($request, $token);
    }

    $this->incrementLoginAttempts($request);
    return $this->sendFailedLoginResponse($request);
}

protected function sendLoginResponse(Request $request, $token)
{
    $this->clearLoginAttempts($request);

    return $this->authenticated($request, $this->guard()->user(), $token);
}

protected function authenticated(Request $request, $user, $token)
{
    setcookie("jwt_token", $token);
    return redirect('/');
    return response()->json([
        'token' => $token,
    ]);
}

protected function sendFailedLoginResponse(Request $request)
{
    return response()->json([
        'message' => "not found",
    ], 401);
}

ミドルウェアの追加AddToken

public function handle($request, Closure $next)
{
    $token = isset($_COOKIE["jwt_token"])?$_COOKIE["jwt_token"]:"";
    //$request['token'] = $token;//this is working
    $request->headers->set("Authorization", "Bearer $token");//this is working
    $response = $next($request);
    //$response->header('header name', 'header value');
    return $response;
}

Kernel.phpにミドルウェアを登録する

 protected $middleware = [
    ....
    \App\Http\Middleware\AddToken::class,
];
1
Rishi Raut

APIを保護するjwtも使用しています。以下のように構成を変更する必要があります。

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

'guards' => [
    ...

    'api' => [
        'driver' => 'jwt', // KEY POINT!!!
        'provider' => 'users',
    ],
],

Jwtライブラリが正しくインストールされていることを確認してください。

  1. Tymon\JWTAuth\Providers\LaravelServiceProvider :: classがconfig/app.phpに追加されます。

  2. プロバイダーで雄弁なモデルを使用する場合、ユーザーモデルはJWTSubjectインターフェイスを実装します。

2
yixiang

Laravelは、既存のデフォルトのスキャフォールディングusers-view-controllerを使用して、デフォルトのセッションベース認証をすぐに使用します。独自の ドキュメント内のカスタムガード を追加する追加の手段があるため、必要に応じてガードを利用できます。

したがって、@ KevinPatelが提案したように、デフォルト構成に戻し、ルートで:JWT認証の下に置きたいルートをグループ化し、JWTMiddlewareを追加します。この場合、JWTAuthを使用するには、認証を担当するコントローラーを更新する必要があります。デフォルトの認証の代わりに。

あなたがそれをよりよく理解する必要があるならば、あなたはこの答えをチェックするべきです Laracastsのこの答え

JWTAuthを組み込む に推奨される方法の1つは、 Dingo API (もちろん、APIを構築していませんが)を選択することです。これは、Dingoが認証やその他のルートにすでにいくつかの肉体を追加しているためです。管理-とても使いやすく、設定も簡単です

私はあなたがこれを試すことができると思います:

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],

[〜#〜]編集[〜#〜]

ステップバイステップの例 からいくつかのヘルプを見つけることができます。この例では、そのトークンベース認証を構成して使用する方法に焦点を当てる必要があります。

これがお役に立てば幸いです。

これを参照してください リンク 。デフォルトとしてAPIを使用している場合、laravel認証はエラーをスローします。

0
Kevin Patel