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
相关产品推荐
相关产品推荐

