You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10认证报错:GenericUser::createToken()方法未定义

Laravel 10认证报错:Call to undefined method Illuminate\Auth\GenericUser::createToken() 解决方法

问题情况

在Laravel 10中实现API认证时,调用createToken方法出现以下错误:

Error: Call to undefined method Illuminate\Auth\GenericUser::createToken()

自定义用户模型为UserRoot,相关代码及配置如下:

用户模型UserRoot代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserRoot extends Model {
  use HasFactory;
}

控制器代码

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\UserRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class UserRoot extends Controller {
  public function login(UserRequest $request){
    $credentials = $request->validated();
    
    if (!Auth::attempt($credentials)) {
      return response([
        "msg"=>"Not connected"
      ]);
    } else {
      $user = Auth::user();
      $token = $user->createToken("mytoken")->plainTextToken;
      return response([
        "msg"=>"connected",
        "user"=>Auth()->user(),
        "status"=>"ok",
        "token"=>$token
      ]);
    };
  }
}

auth.php配置

'providers' => [
  'users' => [
  'driver' => 'eloquent',
  'model' => App\Models\User::class,
],
'users' => [
  'driver' => 'database',
  'table' => 'user_roots',
  ],
],

错误原因

  1. 用户模型未实现认证用户接口:UserRoot继承自普通的Model类,而非Laravel认证专用的Authenticatable基类,同时缺少API令牌相关的Trait(如Sanctum的HasApiTokens),导致没有createToken方法。
  2. 认证提供者配置错误:auth.php中重复定义了users提供者,后一个database驱动的配置会覆盖前一个eloquent配置,此时Auth::user()返回的是GenericUser实例(数据库驱动默认返回的用户对象),该类没有createToken方法。

解决步骤

1. 修改用户模型

让UserRoot继承Authenticatable基类,并引入HasApiTokensTrait(Laravel 10默认API认证使用Sanctum):

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class UserRoot extends Authenticatable {
    use HasApiTokens, HasFactory;
}

2. 修正auth.php配置

删除重复的users提供者,使用eloquent驱动并指向正确的UserRoot模型:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\UserRoot::class,
    ],
],

3. 配置Sanctum(若未配置)

如果是首次使用Sanctum做API认证,执行以下命令发布配置并迁移数据库:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

完成以上步骤后,重新调用登录接口,Auth::user()将返回UserRoot实例,即可正常调用createToken方法生成API令牌。

内容的提问来源于stack exchange,提问作者user23531968

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:43:16