php - laravel 6护照中未经授权的401错误
问题描述
我正在尝试使用 laravel 护照对用户进行身份验证。我遵循 laravel 护照文件中的每一步。但是当我访问受“auth:api”中间件保护的路由时,它会显示错误。我已经在互联网上进行了搜索,但到目前为止,任何答案都不起作用。请查看代码,以及到目前为止我在下面尝试过的内容。
使用的技术
- 拉拉维尔 6
- Laravel 护照
- Vue 2
- 爱讯
到目前为止尝试过:
- 改为中。
Passport::routes();
_ 也试过Passport::routes(null, ['prefix' => 'api/oauth', 'middleware' => ['auth:api', 'web', 'auth']]);
AuthServiceProvider
Passport::routes(null, ['prefix' => 'api/oauth');
- 试图跑
php artisan cache:clear
路线/api.php
Route::middleware('auth:api')->group(function() {
Route::get('user', function() {
return request()->user();
});
Route::get('posts', 'PostController@index')->name('posts');
Route::post('posts/store', 'PostController@store')->name('posts.store');
Route::get('posts/{id}/show')->name('posts.show');
Route::get('users/{id}/show')->name('users.show');
});
爱讯
mounted() {
axios.get('/api/posts')
.then(res => this.posts = res.data).catch(error => console.log('Unable to fetch posts.'))
}
错误
标题:
如果您需要一些我的帖子中没有说明的细节,请告诉我。
设置
- 运行
composer require laravel/passport:9
安装。 - 为桌子奔跑
php artisan migrate
。 - 运行
php artisan passport:install
以生成加密密钥。 - 在模型中添加
Laravel\Passport\HasApiTokens
了特征。User
- 添加
Passport::routes();
在AuthServiceProvider
. - 将驱动程序更改为in
guard
。api
passport
config/auth.php
完整源代码:
解决方案
我认为您应该按照以下步骤检查您的代码。
第 1 步:User
模型必须使用 HasApiTokens
...
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
第 2 步:Passport::routes
您的引导方法中的方法AuthServiceProvider
class AuthServiceProvider extends ServiceProvider
{
...
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
第 3 步:在您的config/auth.php
配置文件中,您应该将 api 身份验证保护的驱动程序选项设置为护照
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
第 4 步(可选):如果您想从 JavaScript 应用程序使用 API,您需要手动向应用程序发送访问令牌,并将其与每个请求一起传递给您的应用程序。但是,Passport
包括一个可以为您处理此问题的中间件。您需要做的就是将CreateFreshApiToken
中间件添加到文件中的 Web 中间件组中app/Http/Kernel.php
:
'web' => [
// Other middleware...
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
!您应该确保CreateFreshApiToken
中间件是中间件堆栈中列出的最后一个中间件。
编辑(2021/10/17):
您应该尝试将身份验证中间件添加到$middlewareGroups
您的Kernel.php
protected $middlewareGroups = [
...
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'auth:api', //Need to add
],
];
编辑(2021/10/25):
我下载了您的代码并进行了调试。当你调试它时,你会得到以下结果:
标头 JWT 对 JSON 结构无效。Laravel Passport
图书馆和您的系统之间似乎不兼容。您应该检查您的系统版本(PHP、Laravel 等)。我会继续调查。如果您有任何新信息,请告诉我
编辑(2021/11/02):
将您的 laravel/framework 依赖项更新为 composer.json 文件中的 ^6.0。如果已安装,请将您的 laravel/passport 依赖项更新为 composer.json 文件中的 ^9.3.2。
https://laravel.com/docs/6.x/upgrade#updating-dependencies
根据 Laravel6.x
文档,Laravel Passport 的版本是从 9.3.2 开始的。请试试这个版本。
推荐阅读
- swift - Firebase 数据和意外的 nil
- .htaccess - 如何将我的 sudomains 网络空间重定向到实际的子域?
- assembly - 如何使用 llvm/clang 构建(或移植?)MASM ASM 文件?
- java - Array/ArrayList 如何直接指向对象的索引?或者 ArrayList 如何知道对象存储在这个地方?
- java - 来自 subscribeToStreamingNotifications 的带有 Item.bind() 的 AccessDenied
- c# - 如何使用 newtonsoft JSON 反序列化器反序列化 Geopoint?
- java - WebSocket 客户端关闭连接
- r - 使用 R 预测多个时间序列
- docker - 我应该/如何避免多个相互依赖的项目的 Docker compose 文件的重复部分
- python - Pandas Dataframe - 用 current_time 替换 NULL 值