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:auth
to 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