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

Laravel Sanctum+NextJS:如何用RTK Query处理CSRF Cookie请求?

在RTK Query中处理Laravel Sanctum的CSRF Cookie逻辑

完全可以在createApi()中通过自定义baseQuery集成Sanctum的CSRF Cookie获取与携带逻辑,无需依赖Axios。核心思路是在发送需要CSRF防护的请求前,自动触发/sanctum/csrf-cookie请求,并将提取到的CSRF Token附加到后续请求头中。

1. 自定义BaseQuery实现CSRF逻辑

编写自定义baseQuery函数,替代RTK Query默认的fetchBaseQuery,内置CSRF处理逻辑:

import { fetchBaseQuery } from '@reduxjs/toolkit/query/react';

const customBaseQuery = async (args, api, extraOptions) => {
  const baseQuery = fetchBaseQuery({
    baseUrl: 'https://your-laravel-api-domain.com',
    credentials: 'include', // 关键:允许携带Cookie,Sanctum依赖此配置
  });

  // 判断是否需要CSRF防护:Sanctum默认只保护非GET请求
  const requiresCsrf = typeof args === 'string' 
    ? !args.startsWith('GET') 
    : args.method?.toUpperCase() !== 'GET';

  if (requiresCsrf) {
    // 先请求CSRF Cookie接口,初始化防护
    await baseQuery('/sanctum/csrf-cookie', api, extraOptions);
    
    // 从Cookie中提取XSRF-TOKEN(Laravel自动将Token存入该Cookie)
    const xsrfToken = document.cookie
      .split('; ')
      .find(row => row.startsWith('XSRF-TOKEN='))
      ?.split('=')[1];

    // 给原请求添加X-XSRF-TOKEN请求头
    const modifiedArgs = typeof args === 'string'
      ? { url: args, headers: { 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) } }
      : {
          ...args,
          headers: {
            ...args.headers,
            'X-XSRF-TOKEN': decodeURIComponent(xsrfToken),
          },
        };

    // 发送处理后的请求
    return baseQuery(modifiedArgs, api, extraOptions);
  }

  // GET请求直接发送
  return baseQuery(args, api, extraOptions);
};

2. 在createApi中使用自定义BaseQuery

将自定义baseQuery传入createApi,所有API请求会自动处理CSRF逻辑:

import { createApi } from '@reduxjs/toolkit/query/react';

export const apiSlice = createApi({
  reducerPath: 'api',
  baseQuery: customBaseQuery, // 绑定自定义baseQuery
  endpoints: (builder) => ({
    // 定义你的API端点示例
    login: builder.mutation({
      query: (credentials) => ({
        url: '/login',
        method: 'POST',
        body: credentials,
      }),
    }),
    fetchUser: builder.query({
      query: () => '/api/user',
    }),
  }),
});

export const { useLoginMutation, useFetchUserQuery } = apiSlice;

3. 关键注意事项

  • 跨域配置:确保Laravel的config/cors.php中设置supports_credentials => true,并允许你的Next.js域名;Next.js端已通过credentials: 'include'支持Cookie跨域携带。
  • 请求缓存优化:可添加缓存逻辑(比如记录上次CSRF请求时间,过期后再重新获取),避免每次非GET请求都调用/sanctum/csrf-cookie。
  • Token解码:XSRF-TOKEN Cookie的值是URL编码的,需用decodeURIComponent()解码后再放入请求头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:05:23