セッションの代わりにlaravel WebページにJWTを使用しようとしているので、いくつか変更を加えました。
次に、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ではなくブレード)のトークン認証を開始する方法。
ここで解決策を見つけました: 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,
];
APIを保護するjwtも使用しています。以下のように構成を変更する必要があります。
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
...
'api' => [
'driver' => 'jwt', // KEY POINT!!!
'provider' => 'users',
],
],
Jwtライブラリが正しくインストールされていることを確認してください。
Tymon\JWTAuth\Providers\LaravelServiceProvider :: classがconfig/app.phpに追加されます。
プロバイダーで雄弁なモデルを使用する場合、ユーザーモデルはJWTSubjectインターフェイスを実装します。
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認証はエラーをスローします。