COOKIE跨域获取问题

最近开发我的项目时,须要用到后端设置session,用户申请时,更具session设置给前端的cookie获取session的值,因为我的项目采纳的是前端后端拆散(前后端不在一个域上),故呈现了如题所示问题:

性能介绍

  1. 用户在登陆时后端返回验证码图片,同时生成session,存储验证码的值,
  2. 用户的登陆时提交验证码的值,如果雷同通过,不雷同从新获取验证码

代码

// 获取验证码  getCaptcha() {    const { ctx } = this;    const captcha = svgCaptcha.createMathExpr({      inverse: false, // 翻转色彩      fontSize: 50, // 字体大小      noise: 1, // 噪声线条数      width: 110, // 宽度      height: 38, // 高度      color: true, // 验证码的字符是否有色彩,默认没有,如果设定了背景,则默认有    });    ctx.session.maxAge = 1000 * 60; // 1分钟    ctx.session.renew = false; // 设置在间断拜访的时候不刷新剩余时间    ctx.session.verifyCode = captcha.text; // 设置session    this.success({      code: captcha.data,    });  } // login  async login() {    const { ctx } = this;    const { account, password, code } = ctx.request.body;    const verifyCode = ctx.session.verifyCode;    console.log(verifyCode);    if (code !== verifyCode) {      this.error('验证码谬误', 444);      return;    }    ...  }

问题来了

所有拜访失常,然而

  1. 用户登录时,后盾取不到session,值为undefined
  2. 前端cookie里也无相应的值

解决

通过查阅,起因是cookie跨域,不能拜访的起因,须要对代码进行相干设置:

参考: https://blog.csdn.net/weixin_...

前端(vue axios):

// 进行一些全局配置axios.defaults.baseURL = 'http://127.0.0.1:7001'; //egg后盾的地址axios.defaults.timeout = 5000;axios.defaults.withCredentials = true; // 让axios发送申请的时候带上cookie

设置后,拜访如下:(这种状况下,还须要后端设置)

后端(用的是阿里的eggjs)

<span>留神:上面有origin的多种设置形式,特地是多个跨域,值得珍藏哦</span>

config.cors = {    // origin: '*',    // origin: 'http://127.0.0.1:9384',    origin(ctx) {      // return "*"; // 容许来自所有域名申请      // return ctx.header.origin;// 当*无奈应用时,应用这句,同样容许所有跨域      // return 'http://localhost:8080'; //单个跨域申请      // 容许多个跨域      const allowCors = [        'http://localhost:9384',        'http://127.0.0.1:9384',        'http://172.16.92.62:9384',      ];      return allowCors.indexOf(ctx.header.origin) > -1 ? ctx.header.origin : '';    },    credentials: true, // 前台能够携带cookies 无此选项的话,还是下面的跨域    allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',  };

设置后

能够失常获取到后盾设置的cookie了(session会主动向前端设置一个cookei)

至此根本登陆能够失常进行了

然而

如果你用的是google浏览器,或者内核是chrome的浏览器,如果版本高于80

后盾获取session,还是undefined

起因

上图能够看到,这种cookie没有胜利

Chrome 51开始,浏览器的Cookie新减少了一个SameSite属性,用来避免CSRF攻打和用户追踪。
该设置以后默认是敞开的,但在Chrome 80之后,该性能默认已开启

参考 https://www.ruanyifeng.com/bl...

解决办法:

用户:

  1. 关上Chrome设置,将chrome://flags/#same-site-by-default-cookies禁用,而后重启浏览器。

  1. 应用低版本浏览器(chrome 小于80版本)

开发者:

  1. 计划1. 将SameSite属性值改为None, 同时 将secure属性设置为true。且须要将后端服务域名必须应用https协定拜访。
  2. 因为设置SameSite = None,有SCRF危险,所以,最佳计划是用token代替Cookie形式作验证。

本例中的解决方案举荐应用Redis解决