我正在配置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
],
],
答案 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);