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

Laravel Breeze+Next.js项目:如何在服务端组件中校验用户认证?

在Laravel Breeze + Next.js的服务端组件中校验用户认证

要在服务端组件(SSC)里校验用户是否已认证,核心是利用Laravel Sanctum的会话认证机制,结合Next.js服务端的Cookie获取能力,直接在服务端完成身份校验。以下是具体实现方案:


1. 直接在服务端组件中携带认证Cookie请求后端

服务端组件渲染时可以直接获取请求携带的Cookie,将laravel_session和XSRF-TOKEN传递给后端Sanctum接口,以此校验用户身份:

import { cookies } from 'next/headers';

export default async function Me() {
  const cookieStore = cookies();
  const laravelSession = cookieStore.get('laravel_session')?.value;
  const xsrfToken = cookieStore.get('XSRF-TOKEN')?.value;

  // 发起服务端请求,携带认证信息
  const response = await fetch('http://你的Laravel域名/api/test-data', {
    headers: {
      Cookie: `laravel_session=${laravelSession}; XSRF-TOKEN=${xsrfToken}`,
      'X-XSRF-TOKEN': xsrfToken
    },
    credentials: 'include'
  });

  // 校验请求状态,未认证会返回401
  if (!response.ok) {
    // 未认证时的处理:返回提示或跳转登录页
    return <div>请先登录后访问</div>;
  }

  const data = await response.json();

  return (
    <div>
      Server side component - { data.length }
    </div>
  );
}

2. 封装复用的认证校验函数

把认证逻辑抽成单独的工具函数,方便在多个服务端组件中复用:

// app/lib/auth.js
import { cookies } from 'next/headers';

export async function getAuthenticatedUser() {
  const cookieStore = cookies();
  const laravelSession = cookieStore.get('laravel_session')?.value;
  const xsrfToken = cookieStore.get('XSRF-TOKEN')?.value;

  // 缺少必要Cookie直接返回null
  if (!laravelSession || !xsrfToken) return null;

  // 请求Laravel的用户信息接口校验身份
  const response = await fetch('http://你的Laravel域名/api/user', {
    headers: {
      Cookie: `laravel_session=${laravelSession}; XSRF-TOKEN=${xsrfToken}`,
      'X-XSRF-TOKEN': xsrfToken
    },
    credentials: 'include'
  });

  return response.ok ? await response.json() : null;
}

在服务端组件中调用:

import { getAuthenticatedUser } from '@/app/lib/auth';
import { cookies } from 'next/headers';

export default async function Me() {
  const user = await getAuthenticatedUser();

  if (!user) {
    return <div>请先登录</div>;
  }

  // 已认证,获取业务数据
  const cookieStore = cookies();
  const laravelSession = cookieStore.get('laravel_session')?.value;
  const xsrfToken = cookieStore.get('XSRF-TOKEN')?.value;

  const dataResponse = await fetch('http://你的Laravel域名/api/test-data', {
    headers: {
      Cookie: `laravel_session=${laravelSession}; XSRF-TOKEN=${xsrfToken}`,
      'X-XSRF-TOKEN': xsrfToken
    },
    credentials: 'include'
  });

  const data = await dataResponse.json();

  return (
    <div>
      欢迎 {user.name} - Server side component - { data.length }
    </div>
  );
}

注意事项

  • 确保Laravel后端的SANCTUM_STATEFUL_DOMAINS配置项包含你的Next.js域名,否则跨域请求会被拒绝
  • 服务端请求必须携带完整的认证Cookie和XSRF Token,Sanctum才能识别用户会话
  • 未认证的处理逻辑直接在服务端完成,无需等到客户端渲染后再跳转

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:22:40