苹果cmsV10(tp5)对接Vuejs前后端分离项目跨域传递Cookie配置和解决方案

发布于 2021-10-12 21:38:59

自从 Chrome 94 +版本以后完全不能配置跨域传递cookie,需要你添加 SameSite=None,包括 tp5 自带的 PHPSESSID ,这个 PHPSESSID 涉及到验证码和登录状态,如果是跨域请求的话,会提示以下报错:

此Set-ookie标头未指定"SameSite"属性,它默认为"SameSite=lax'"并被阻止,因为它来自跨站点响应,而不是对顶级导航的响应。必须为此Set-Cookie设置"SameSite=None"才能实现跨站点使用。
image.png
截止今日:2021年10月12日,网络上海搜索不到有用的解决方法,你能搜索到的一般都是 Chrome 80以前的相关资料。
解决问题就是想办法 给 PHPSESSID后面加上 Samesite=None; Secure,也就是 cookie: PHPSESSID=dm7amfo8bbbfgt7v181ugmnujk Samesite=None; Secure
image.png
还有一个要求 就是请求的 地址必须是 HTTPS 协议,不然依旧会提示 Samesite=None; Secure 是有不安全的连接提供的。

那么如何给 PHPSESSID 加上 Samesite=None; Secure呢?

ThinkPHP5.0只要在控制初始化时加上以下代码即可为 PHPSESSID 加上 Samesite=None; Secure,可以在扩展行为 action_begin控制器开始标签位使用。
这里还有个嘴关键的问题是必须是PHP7.3版本才生效。

session_set_cookie_params(['samesite' => 'None', 'secure' => true]);
session_start();

在ThinkPHP5.0行为 action_begin 控制器开始标签位使用的完整示例代码:

路径 application/tags.php添加 app\\common\\behavior\\CheckAuth

// 操作开始执行
  'action_begin' => [
     'app\\common\\behavior\\CheckAuth',  
  ],

路径 application/common/behavior/CheckAuth.php

<?php
namespace app\common\behavior;

class CheckAuth
{
 
  public function run(&$params)
  {
      if(defined('ENTRANCE') && ENTRANCE == 'index') {
           session_set_cookie_params(['samesite' => 'None', 'secure' => true]);
           session_start();
       }
  }
 
}

以上操作后结果如下:
image.png

现在可以正常登录,验证码不在一直报错了,cookie也能持久保存登录状态,这个坑我自己处理了好几天,值得记录一下的开发经历。

0 条评论

发布
问题