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

新手上路,请多包涵

我正在配置 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
    ],
],

原文由 SimpleJ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 534
2 个回答

您可以通过将此标头与您的请求一起发送来解决它。

 Accept : application/json

这将发送带有 401 状态代码的消息。

 {
    "message": "Unauthenticated."
}

原文由 Ariful Haque 发布,翻译遵循 CC BY-SA 3.0 许可协议

TLDR

您需要确保请求包含 Accept: application/json 标头。

细节

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

This exception is handled by the render method in Illuminate/Foundation/Exceptions/Handler.php , and will in turn call the the unauthenticated() method which is defined in your app/Exceptions/Handler.php :

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

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

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

如果您的请求具有 Accept: application/json 标头或 X-Requested-With: XMLHttpRequest ,则 expectsJson() 方法将返回 true。 Accept: application/json 标头更适合 api 调用,而 X-Requested-With: XMLHttpRequest 标头用于 ajax 调用。

因此,在不更改任何应用程序代码的情况下,只需确保请求包含 Accept: application/json 标头。

但是,如果您需要在用户未通过身份验证时发生不同的操作,您可以在 app/Exceptions/Handler.php 中修改此 unauthenticated() 方法:

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

    // return a plain 401 response even when not a json call
    return response('Unauthenticated.', 401);
}

原文由 patricus 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏