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', ], ],
错误原因
- 用户模型未实现认证用户接口:
UserRoot继承自普通的Model类,而非Laravel认证专用的Authenticatable基类,同时缺少API令牌相关的Trait(如Sanctum的HasApiTokens),导致没有createToken方法。 - 认证提供者配置错误:
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
相关产品推荐
相关产品推荐

