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

时间:2017-07-29 07:23:20

标签: php laravel authentication jwt

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

  1. 已安装jwt-authconfigure

  2. 然后在config / auth.php

    中将默认保护更改为api
    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],
    
    'guards' => [
        ...
    
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    
  3. 现在我收到错误

      

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

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

5 个答案:

答案 0 :(得分:2)

我也使用jwt保护我们的api。你应该改变你的配置如下:

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

'guards' => [
    ...

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

确保正确安装了jwt库:

  1. 您的config / app.php中添加了Tymon \ JWTAuth \ Providers \ LaravelServiceProvider :: class。

  2. 如果您在提供商中使用雄辩的模型,您的用户模型将实现JWTSubject接口。

答案 1 :(得分:1)

我在此处找到了解决方案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');

在/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,
];

答案 2 :(得分:0)

我想你可以试试这个:

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

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

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

修改

您可以从step by step example找到一些帮助。在此示例中,您需要关注如何配置和使用该令牌基本身份验证。

希望这对你有所帮助。

答案 3 :(得分:0)

请参阅此link。如果您使用api作为默认值,则laravel身份验证将引发错误。

答案 4 :(得分:0)

Laravel使用默认的基于会话的身份验证,使用您已有的默认脚手架users-view-controller。您还可以添加自己的custom guard in the doc,以便根据需要使用后卫。

因此,正如@KevinPatel建议的那样,恢复到默认配置,然后在你的路由中:将你想要在JWT认证下的路由分组,添加JWTMiddleware,在这种情况下你必须更新负责你的身份验证的控制器使用JWTAuth而不是默认的auth。

如果您需要了解更多,请查看此答案,请查看this answer on Laracasts

incorporate the JWTAuth的一个推荐方法是去Dingo API(当然你不是在构建api,但是)因为Dingo已经为身份验证和其他路由管理添加了一些内容 - 所以事情很漂亮易于使用和配置