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

Laravel Sanctum中createToken()报错及认证、购物车问题咨询

Laravel Sanctum Cookie认证问题解答

1. createToken方法未定义的解决办法

这个错误是因为你的User模型没有引入Sanctum提供的HasApiTokens trait。修改你的User模型:

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable; // 加上HasApiTokens

    // ... 模型其他代码
}

2. 登录(signin)逻辑优化

你的登录代码存在冗余和逻辑问题:

  • Auth::attempt($credentials)已经完成了账号密码的验证,后续的User::where查询和Hash::check完全多余,直接调用Auth::user()就能拿到当前认证用户。
  • 简化后的正确登录逻辑:
public function signin(Request $request) {
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required'
    ]);

    if (!Auth::attempt($credentials)) {
        return response()->json(['error' => 'Email or password is incorrect'], 401);
    }

    $user = Auth::user();
    $token = $user->createToken('api-token')->plainTextToken;
    // 生产环境建议开启httponly和secure属性,提升Cookie安全性
    $cookie = cookie('sanctum-token', $token, 60*24, null, null, true, true);
    return response()->json(['user' => $user])->withCookie($cookie);
}

另外,去掉$user = Auth::user();后,你通过User::where(...)拿到的只是普通用户实例,并没有完成Sanctum的认证流程,后续受Sanctum保护的接口会拒绝访问。

3. 登出(signout)逻辑修正

原来的Auth::logout()是针对Session认证的,不适用于Sanctum的Token认证。正确的登出需要删除当前用户的认证Token:

public function signout(Request $request) {
    $request->user()->currentAccessToken()->delete();
    // 若要删除用户所有有效Token,替换为:$request->user()->tokens()->delete();
    return response()->json(['message' => 'Logged Out'], 200);
}

注意这个接口需要通过auth:sanctum中间件保护,确保只有已认证用户能调用。

4. 购物车关联用户的实现建议

当前的路径是可行的,但需要注意以下几点:

  • 在addtoCart方法的路由上添加auth:sanctum中间件,拦截未认证请求:
// routes/api.php
Route::post('/cart/add', [CartController::class, 'addtoCart'])->middleware('auth:sanctum');
  • 在addtoCart方法中直接通过Auth::user()->id获取当前用户ID,关联购物车商品:
public function addtoCart(Request $request) {
    $userId = Auth::user()->id;
    // 业务逻辑:创建或更新购物车记录,关联$userId与目标商品ID
}
  • 前端请求时需配置携带凭证(React中axios设置withCredentials: true),确保Cookie能被正确发送到后端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:42:48