You need to enable JavaScript to run this app. Laravel用Curl携带laravel_session调用内部接口仍无法获取登录会话怎么办
优惠活动
大模型
产品
解决方案
定价
更多

Laravel用Curl携带laravel_session调用内部接口仍无法获取登录会话怎么办

问题根因

核心问题是Laravel对会话Cookie默认做了加密处理,$request->cookie('laravel_session') 获取到的是解密后的明文会话ID,你直接将明文值通过Curl传给目标接口时,目标接口的Laravel加密中间件会尝试对这个明文值做解密操作,解密失败后会直接生成新的空会话,自然无法获取到登录态。


解决方案

方法1:调整Curl配置适配会话校验

步骤1:修复被调用方法的参数注入

你当前的callTo方法没有注入Request实例,直接调用$request会报错,先修正:

// 注入Request实例
public function callTo(Request $request) {
  $laravel_cookie = $request->cookie('laravel_session');
  $userId = \Auth::id();
  // 调整后可正常拿到用户ID
}    

步骤2:修改Curl请求配置

不要用$request->cookie()拿会话ID,直接从全局变量$_COOKIE中读取未经过Laravel解密处理的原始值,同时补充必要的校验头:

public function callingFunction(Request $request) {
  //login user
  $this->getSession('MY_USER_LOGIN');

  $userId = \Auth::id();
  //logged userid is available - ok 已正常获取到登录用户ID

  //call another controller 调用另一个控制器接口
  $curl = curl_init('another_addres_on_server_for_callTo_function');
  curl_setopt($curl, CURLOPT_POST, true);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  // 本地HTTPS测试可加该配置,生产环境按需关闭
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

  // 获取原始加密的会话Cookie
  $rawSession = $_COOKIE['laravel_session'] ?? '';
  // 如果项目开启了XSRF校验,需要同步传递XSRF Token
  $rawXsrf = $_COOKIE['XSRF-TOKEN'] ?? '';
  $cookieStr = "laravel_session={$rawSession}; XSRF-TOKEN={$rawXsrf}";
  curl_setopt($curl, CURLOPT_COOKIE, $cookieStr);

  // 补充XSRF请求头
  curl_setopt($curl, CURLOPT_HTTPHEADER, [
      'X-XSRF-TOKEN: ' . urldecode($rawXsrf),
      'Accept: application/json'
  ]);

  $response = curl_exec($curl);
  curl_close($curl);
}

注意:请确认你config/session.php中的domain、path、secure配置和你Curl请求的地址匹配,比如secure设为true时Curl请求必须走HTTPS协议,domain设为.yourdomain.com时Curl请求的域名必须属于yourdomain.com后缀,否则会话依然会校验失败。


方法2:更优的内部调用方案(无需Curl)

同项目内部接口调用完全不需要走Curl,直接用Laravel自带的调度方法即可,自动继承当前所有会话上下文,性能更高也没有会话校验问题:

public function callingFunction(Request $request) {
    $userId = \Auth::id();
    // 直接调用指定控制器的callTo方法,可自定义传参
    $response = app()->call('App\Http\Controllers\你的目标控制器类名@callTo', [
        // 按需传递参数
        'customParam' => 'xxx'
    ]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 12:15:06