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

Laravel Sanctum移动端API Ionic端登录报TOKEN MISMATCH如何解决

问题描述

我基于Laravel Sanctum搭建了供移动端应用调用的REST API,在Postman中测试所有接口均运行正常,但移动端开发人员在Ionic应用中调用登录接口时返回TOKEN MISMATCH错误,相关代码与测试信息如下:

API路由代码

Route::post('/register', [ApiController::class, 'register']);
Route::post('/login', [ApiController::class, 'login']);

登录接口控制器实现

public function login(Request $request){
    $fields = $request->validate([
        'email' => 'required|string|email|max:255',
        'password' => 'required|string|min:8'            
    ]);

    //validate login parameters
    //check email
    $user = User::where('email', $fields['email'])->first();

    //check password
    if(!$user || !Hash::check($fields['password'], $user->password)){
        return response([
            'message' => 'Invalid Credentials'
        ], 401);
    }

    $token = $user->createToken('myapptoken')->plainTextToken;
    //return $user->createToken($request->device_name)->plainTextToken;

    $response = [
        'user' => $user,
        'token' =>$token,
    ];

    return response($response, 201);
}

相关测试信息


排查解决步骤

这个错误基本都是请求误触发了Web端的CSRF校验导致的,和Sanctum令牌生成逻辑本身无关,按以下顺序排查即可:

  • 第一步:确认路由挂载的中间件组
    打开app/Providers/RouteServiceProvider.php,确认routes/api.php是挂载在api中间件组下,而非web中间件组。web组默认开启全局CSRF校验,未携带合法CSRF令牌就会直接返回TOKEN MISMATCH。Postman默认不会自动存储携带目标站点的cookie,所以本地测试不会触发这个校验;Ionic的WebView如果之前访问过同域名页面、自动带上了存储的cookie,就会直接命中CSRF拦截规则,根本走不到你写的登录逻辑里。
    正确的路由挂载配置参考:
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));
    
  • 第二步:配置CSRF排除规则(架构调整成本高时用)
    如果因为项目特殊架构必须把API路由放在web组下,打开app/Http/Middleware/VerifyCsrfToken.php,把API路径加入排除名单:
    protected $except = [
        '/api/*',
    ];
    
  • 第三步:检查Ionic端请求配置
    确认Ionic发起请求时满足以下要求:
    • 请求头不要携带X-XSRF-TOKEN、X-CSRF-TOKEN这类CSRF相关字段
    • 不要配置请求自动携带同域/跨域cookie,纯接口令牌认证不需要cookie参与
    • 必须在请求头设置Accept: application/json,避免Laravel把请求判定为Web端页面请求
  • 第四步:核对Sanctum配置项
    打开config/sanctum.php,确认SPA认证的状态域配置没有包含移动端接口域名,同时.env里的SANCTUM_STATEFUL_DOMAINS不要填写当前API域名,留空或者只配置实际需要走SPA Cookie认证的前端域名即可。

校验技巧:改完配置后如果还是报错,可以直接在VerifyCsrfToken中间件里加日志打印,确认触发CSRF拦截的请求路径,排查是不是有其他全局中间件把API请求路由到了Web校验流程里。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:27:33