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

Laravel 10.x中Laravel Sanctum用户令牌认证配置问题求助

Laravel Sanctum 令牌认证401问题排查与解决

核心问题分析

你的配置和代码存在以下关键错误,导致令牌认证失效:

  • API Guard 驱动配置错误:使用Session驱动而非Sanctum专属驱动,无法识别Bearer令牌
  • User模型缺少Sanctum令牌支持的必要Trait
  • 代码中残留旧版API令牌的冗余逻辑
  • 更新接口的验证规则存在逻辑漏洞

分步解决方案

1. 修正config/auth.php的Guard配置

将API Guard的驱动改为sanctum,这是Sanctum识别令牌的核心配置:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],
'guards' => [
    'api' => [
        'driver' => 'sanctum', // 替换原来的session
        'provider' => 'users',
    ],
],

2. 给User模型添加Sanctum令牌支持Trait

打开App\Models\User.php,引入并使用HasApiTokens trait:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; // 引入该Trait

class User extends Authenticatable
{
    use HasApiTokens, Notifiable; // 添加到Trait列表中

    // ... 其他原有代码
}

这个Trait是生成和验证Sanctum令牌的必要条件。

3. 清理UserController中的冗余代码

  • Store方法:移除手动生成api_token的代码(Sanctum无需此字段,令牌存储在personal_access_tokens表),同时给令牌名称设置默认值:
$user = User::create([
    'name' => $request->name,
    'email' => $request->email,
    'password' => Hash::make($request->password),
    // 删除此行:'api_token' => Str::random(60),
]);

// ... 其他代码
$token = $request->user()->createToken($request->token_name ?? 'auth_token');
  • Update方法:修复两个问题:
    • 密码需加密存储,不能直接存明文
    • 邮箱验证需排除当前用户,否则更新时会触发唯一约束错误
public function update(Request $request)
{
    $user = $request->user();
    
    $request->validate([
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:' . User::class . ',' . $user->id],
        'password' => ['required', 'confirmed', Rules\Password::defaults()],
    ]);

    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = Hash::make($request->password); // 增加密码加密
    $user->save();
    return $user;
}

4. 验证Sanctum迁移与数据库

确保已执行Sanctum的迁移命令,生成personal_access_tokens表:

php artisan migrate

若之前未安装Sanctum,先执行安装命令:

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

5. 接口调用规范

调用需要认证的接口(user/update)时,必须在请求头中携带令牌:

Authorization: Bearer 你的令牌字符串

测试流程

  1. 调用/api/register或/api/login获取Bearer令牌
  2. 用Scramble/Postman等工具,在请求头添加Authorization字段,令牌前缀为Bearer
  3. 调用/api/user,应返回当前用户信息,不再返回401错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:16:04