使用Laravel和Passport响应身份验证失败的状态码401?

时间:2017-03-07 19:57:07

标签: php laravel authentication

我正在配置Laravel项目以使用Passport令牌身份验证。一切似乎都在起作用,但是当auth:api中间件失败时,它会响应状态为200的客户端以及响应正文中的一堆HTML。相反,我希望它的回复状态为401

我无法在Laravel Passport源代码中找到任何关于做类似事情的文档。我甚至找不到中间件的来源。

我的测试路线:

Route::get('/protected', function () {
    return response()->json([
        'success' => true
    ]);
})->middleware('auth:api');

配置/ auth.php

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'appUsers',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'appUsers' => [
        'driver' => 'eloquent',
        'model' => App\Models\AppUser::class
    ],
],

3 个答案:

答案 0 :(得分:13)

您可以通过在请求中发送此标头来解决此问题。

Accept : application/json

这将使用401状态代码发送此消息。

{
    "message": "Unauthenticated."
}

答案 1 :(得分:7)

如果用户未进行身份验证,Laravel将抛出AuthenticationException

此异常由Illuminate/Foundation/Exceptions/Handler.php中的render方法处理:

public function render($request, Exception $e)
{
    $e = $this->prepareException($e);

    if ($e instanceof HttpResponseException) {
        return $e->getResponse();
    } elseif ($e instanceof AuthenticationException) {
        return $this->unauthenticated($request, $e);
    } elseif ($e instanceof ValidationException) {
        return $this->convertValidationExceptionToResponse($e, $request);
    }

    return $this->prepareResponse($request, $e);
}

处理程序调用{​​{3}}中定义的unauthenticated()方法:

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

正如您所看到的,默认情况下,如果请求需要JSON响应,那么您将获得带有JSON错误正文的401。如果请求不期望JSON,请求将被重定向到登录页面。

如果您希望在未对用户进行身份验证时执行其他操作,则可以在unauthenticated()中修改此app/Exceptions/Handler.php方法:

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return response('Unauthenticated.', 401);
}

答案 2 :(得分:3)

在中间件中,您可以这样返回:

return abort(401);