【问题标题】:Laravel and Passport getting SQLSTATE[42S22]: Column not found: 1054 Unknown column 'api_token'Laravel 和 Passport 获取 SQLSTATE [42S22]:找不到列:1054 未知列 'api_token'
【发布时间】:2020-02-26 21:27:39
【问题描述】:

我看过很多关于这个错误的帖子,但没有一个解决方案对我有用。

我正在使用 Passport 运行 Laravel,它在我的开发服务器上运行良好。正如预期的那样,当尝试检查用户是否在我的开发服务器上通过身份验证时,它会返回捕获(在 axios 调用中):

开发服务器

"message":"Unauthenticated."

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

生产服务器:

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

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

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

编辑

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

【问题讨论】:

    标签: laravel authentication axios passport.js


    【解决方案1】:

    我也遇到过同样的问题。我正在使用 Laravel Passport。这一切都与配置有关。到 config/auth.php 并将 api 数组的驱动程序名称更改为警卫数组中的护照

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我已经解决了这个问题

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

      可能有帮助

      【讨论】:

        【解决方案3】:

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

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

        例如使用圣所:

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

        【讨论】:

          【解决方案4】:

          尽管出现了令人困惑的错误,但我还是按照in this post 的步骤进行操作,现在它通过 RequestGuard 正确路由身份验证请求,并按预期进行身份验证。

          不知道缓存是如何被弄乱的,但我猜我的配置缓存卡在 web Guard 上,也许现在通过 api guard 正确地清除它。

          希望这对其他人有所帮助。

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

            • 同意。您可以像地狱一样清除缓存、配置和路由,但如果该列不存在,它将不起作用;)这应该是批准的答案!
            【解决方案6】:

            尝试运行:

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

            【讨论】:

              【解决方案7】:

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

              1. php 工匠密钥:生成
              2. php 工匠配置:缓存
              3. php artisan 缓存:清除
              4. php 工匠配置:清除

              【讨论】:

                猜你喜欢
                • 2018-02-21
                • 2015-12-08
                • 2018-11-02
                • 2019-10-02
                • 2017-04-03
                • 2021-10-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多