Laravel Sanctum:列未找到:1054 'api_token'在'where clause'中是未知的

11

包: Sanctum

在生成令牌后,当请求获取数据时,会抛出以下错误

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'api_token' in   
'where clause' (SQL: select * from `users` where `api_token` = XAzuNGUeOJ8CXbIoGEWhBTtWIFr0lFr8jjwScXQ4B0Qxfmu
2cHm9LaUwGX96zy0AnXhLLcCnBFCodQaOlimit 1) in file

1
用户表中是否存在 api_token 列? - Brian Lee
1
可能忘记了迁移吗? - Ron van der Heijden
你解决了这个问题吗?是同一个 bug 吗? - Pavel Prokofiev
1
在 kernel.php 中导入 EnsureFrontendRequestsAreStateful 以进行令牌验证。在 API 部分中使用 Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful。 - Parth kharecha
你解决了这个问题吗?@Parthkharecha - hakkikonu
1
@hakiko 是的,请查看此链接 https://dev59.com/CFIH5IYBdhLWcg3wHZRA#65472868 - Parth kharecha
10个回答

27

前往config/auth.php

将guards中的api数组更改为sanctum 例如:

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

        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

2
是的确实如此。很好他们将这个放在他们的文档中。我浪费了几个小时在这上面。 - Digital Human
它没有解决我的问题。我清除了所有缓存。我正在使用v8 :( - hakkikonu
谢谢!在最新的laravel版本中,他们已经将API守卫作为默认选项删除了。谢谢,它有效。php artisan cache:clear php artisan config:cache``` - LogGurkha

7

前往 routes/api.php 并使用以下内容

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

取代

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

3

在api.php文件中

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

在config/auth.php中。
'api' => [
    'driver' => 'sanctum',
    'provider' => 'users',
    'hash' => false,
],

然后它将修复该问题。我已将代码上传到我的GitHub。https://github.com/ramseyjiang/laravel_8_api


虽然这段代码可能回答了问题,但是加上一些解释说明它是如何解决问题的,为什么能够解决问题,将会提高你的回答质量。 - ᴄʀᴏᴢᴇᴛ
@ᴄʀᴏᴢᴇᴛ 你需要确保 api -> driver 被设置为 sanctum - arhakim

1

kernel.php中导入EnsureFrontendRequestsAreStateful以进行令牌验证。

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

class Kernel extends HttpKernel
{

    'api' => [
               ------
               EnsureFrontendRequestsAreStateful::class,
               ------
             ],
}

0

运行迁移,然后检查,如果问题仍然存在,则可能是 users 表中没有 api_token 字段或者在 User 模型的 $fillable 数组中未定义。


0
  • 首先删除表格 personal_access_tokens
  • 其次从您的迁移表中删除包含 "%create_personal_access_tokens_table%" 的行。
  • 第三步再次执行 php artisan migrate

0

运行

  1. php artisan cache:clear
  2. php artisan config:clear
  3. php artisan route:clear

然后重新启动Apache和Mysql(对于XAMPP/WAMPP),再次运行artisan serve command,这对我有用。确保您先阅读它们的文档。


这是一个典型的缓存清除方法,但它如何帮助解决所提出的问题呢? - Gleb Kemarsky

0
在我的情况下,我已经弄乱了config\sanctum.php文件。具体来说,我已经将守卫更改为'guard' => ['api']
将其恢复为'guard' => ['web']即可解决问题。不确定我为什么要首先更改它。

0

你可以尝试在你的 API 路由中添加 "middleware(auth:sanctum)"。

例如:

Route::middleware('auth:sanctum')->get('products', function() {
      //code
})->name('api.products');

0

针对这个问题,经过我仔细思考后,我决定清空应用程序、配置和路由缓存,这对我来说是解决问题的有效方法。

  php artisan cache:clear

2. 当您希望清除应用程序缓存时,可以在控制台中运行上述语句。它的作用是清除 storage\framework\cache 中的所有缓存。

  php artisan route:cache

3. 这将清除您的路由缓存。因此,如果您已添加了新路由或更改了路由控制器或操作,则可以使用此方法重新加载相同的内容。

  php artisan config:cache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接