Laravel Passport:auth:api 的行为类似于 auth:web

Posted

技术标签:

【中文标题】Laravel Passport:auth:api 的行为类似于 auth:web【英文标题】:Laravel Passport: auth:api behaving like auth:web 【发布时间】:2018-02-01 22:57:01 【问题描述】:

我正在尝试在我的应用程序中实现passport 来验证api 调用。我已经完成了官方文档中提到的配置。 我的身份验证守卫中有这个:

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

而且,这在我的 AuthServiceProvider's boot() 方法中:

Passport::routes();

这是我正在尝试访问的route

    Route::middleware('auth:api')->get('/user', function (Request $request) 
    return $request->user();
);

Route::group(['namespace' => 'Api', 'middleware' => 'auth:api'], function () 
    // Login Controller
   Route::get('/getclc', 'PreController@getClc');
);

我在这样的请求中发送header

Authorization:Bearer $accessToken

我的问题是: 1. 当请求受保护的路由时,它会将我发送到登录页面,但我希望它返回 401。我该怎么做?

我的laravel 版本是 5.4.33。

【问题讨论】:

你能告诉我们所有的路线吗? @AntonisTsimourtos 我已经用所有路线更新了我的问题。请看一看。 嗯,错误显然意味着“登录”路线没有定义。你可以尝试运行php artisan make:authto scaffold the authentication pages needed。然后你可以尝试使用php artisan clear:cache 我按照你说的做了,现在它发送到登录页面而不是返回错误。 所以“问题解决了”。现在你可能不得不考虑你想做什么?如果用户未通过身份验证,您是否要返回 401 或将他重定向到登录页面?您也可以更新您的问题。 【参考方案1】:

当身份验证失败时,Laravel 会抛出一个AuthenticationException 异常。此异常由您的 Laravel 异常处理程序处理,并最终调用您的 app/Exceptions/Handler.php 文件中的 unauthenticated() 方法。

您可以从该方法中看到,如果您的请求需要 json 响应,您将获得 401 Unauthenticated 响应。但是,如果您不期待 json 响应,它只会重定向到名为“login”的路由。如果您没有名为“login”的路由,这显然会失败。

当您发送“X-Requested-With: XMLHttpRequest”标头或“Accept: application/json”标头时,您的请求“expectsJson”。否则,它被认为是一个正常的网络请求。

如果您想更改应用程序处理未经身份验证的用户的方式,unauthenticated() 方法就是要更改的方法。

【讨论】:

【参考方案2】:

在邮递员的标头上添加此代码。

key           Value
Accept        application/json

谢谢

【讨论】:

以上是关于Laravel Passport:auth:api 的行为类似于 auth:web的主要内容,如果未能解决你的问题,请参考以下文章

[PHP] 浅谈 Laravel auth:api 不同驱动 token 和 passport 的区别

Laravel Passport - 保护不同用户类型的路由

获取经过身份验证的用户 Laravel/Lumen Passport

将自定义中间件添加到 Laravel Passport 端点

使用 Laravel Passport 范围进行单元测试

Laravel 5.3 + Passport:总是未经身份验证的错误