如何在laravel网页中使用令牌认证

Nik*_*aut 11 php authentication jwt laravel

我正在尝试将JWT用于laravel网页而不是会话.所以我做了一些改变.

  1. 安装jwt-auth配置

  2. 然后api在config/auth.php中更改默认保护

    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],
    
    'guards' => [
        ...
    
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    
    Run Code Online (Sandbox Code Playgroud)

现在我收到了错误

(1/1)FatalErrorException在AuthenticatesUsers.php中调用未定义的方法Illuminate\Auth\TokenGuard :: attempt()(第75行)

如何修复此问题并启动laravel网页的令牌身份验证(刀片而不是API).

Nik*_*aut 2

我在这里找到了解决方案https ://github.com/tymondesigns/jwt-auth/issues/860

在 /routes/api.php - 添加了一些基本的身份验证路由

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

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

在 /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);
}
Run Code Online (Sandbox Code Playgroud)

添加中间件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;
}
Run Code Online (Sandbox Code Playgroud)

在 Kernel.php 中注册中间件

 protected $middleware = [
    ....
    \App\Http\Middleware\AddToken::class,
];
Run Code Online (Sandbox Code Playgroud)