首页 > 解决方案 > laravel 6护照中未经授权的401错误

问题描述

我正在尝试使用 laravel 护照对用户进行身份验证。我遵循 laravel 护照文件中的每一步。但是当我访问受“auth:api”中间件保护的路由时,它会显示错误。我已经在互联网上进行了搜索,但到目前为止,任何答案都不起作用。请查看代码,以及到目前为止我在下面尝试过的内容。

使用的技术

到目前为止尝试过:

路线/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.'))
}

错误

标题:

在此处输入图像描述

如果您需要一些我的帖子中没有说明的细节,请告诉我。

设置

  1. 运行composer require laravel/passport:9安装。
  2. 为桌子奔跑php artisan migrate
  3. 运行php artisan passport:install以生成加密密钥。
  4. 在模型中添加Laravel\Passport\HasApiTokens了特征。User
  5. 添加Passport::routes();AuthServiceProvider.
  6. 将驱动程序更改为in guardapipassportconfig/auth.php

完整源代码:

点击这个链接

标签: phplaravelvue.jsaxioslaravel-passport

解决方案


我认为您应该按照以下步骤检查您的代码。

第 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 开始的。请试试这个版本。


推荐阅读