Laravel 5.8和Passport获得SQLSTATE [42S22]:找不到列:1054未知列'api_token'

时间:2019-10-31 13:46:18

标签: laravel authentication axios passport.js

我已经看到很多有关此错误的帖子,但是没有一种解决方案对我有用。

我正在使用Passport运行Laravel 5.8,在我的开发服务器上可以正常工作。如预期的那样,当尝试检查用户是否在我的开发服务器上通过身份验证时,它会返回catch(在axios调用内部):

开发服务器

"message":"Unauthenticated."

但是,当在我的生产服务器上运行相同的代码时,它将返回catch:

生产服务器:

"message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'api_token'
in 'where clause' (SQL: select * from `users` where `api_token` = ...

我已经运行了Passport迁移,并且在config / auth.php中将['guards'] ['api'] ['driver']设置为passport,并更新了配置缓存,显然可以解决其他问题。

似乎身份验证需要使用护照迁移中的oauth表,但查询似乎正在查看用户表。

编辑

我能够确定我的开发服务器使用RequestGuard类来查找用户,而我的生产服务器使用TokenGuard类来查找用户。

7 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。我正在使用Laravel Passport。一切都与配置有关。进入config/auth.php并将api数组的驱动程序名称更改为guards数组内的passport

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',//instead of token 
        'provider' => 'users',
        'hash' => false,
    ],
],

答案 1 :(得分:3)

我遇到了同样的问题,并且已经通过

解决了这个问题
php artisan config:clear
php artisan config:cache
php artisan cache:clear

可能有帮助

答案 2 :(得分:2)

当您使用错误的身份验证中间件时也可能发生:

public function __construct()
{
$this->middleware('auth:api');
}

例如使用圣所:

public function __construct()
{
$this->middleware('auth:sanctum');
}

答案 3 :(得分:0)

尽管存在令人困惑的错误,但我遵循了in this post步骤,它现在可以正确地通过RequestGuard路由身份验证请求,并按预期进行了身份验证。

不确定如何弄乱缓存以引起这种情况,但是我猜测我的配置缓存卡在了Web Guard上,也许现在清除它可以正确地通过api Guard路由。

希望这对其他人有帮助。

答案 4 :(得分:0)

尝试运行:

php artisan config:cache
php artisan cache:clear
php artisan config:clear

答案 5 :(得分:0)

我已经通过在composer窗口中运行以下命令解决了

  1. php artisan key:generate
  2. php 工匠配置:缓存
  3. php artisan 缓存:清除
  4. php artisan 配置:清除

答案 6 :(得分:0)

您的用户表中必须有一个名为 api_token 的列,
并且此列必须为每条记录填充唯一值, 您可以将其添加到您的迁移中,例如

$table->string('api_token', length)->after( .. ) 或手动创建

api 应用程序通过使用 api_token 值而不是“id”来验证用户