登录cookie问题~

1,255 阅读3分钟

记一次cas登录遇到的各种坑~

1. cas原理

【基础】项目开始前需理解下CAS:

下面开始步入正题啦

【环境】:我们的项目,前端共包含4种环境:

  • 线上环境
  • staging环境(测试环境)
  • 提测环境
  • 本地环境

线上、staging略略略,不会涉及跨域问题,下面针对本地环境进行叙说:

【背景】

未接入cas前:

启动:npm start

访问: localhost:3000

解决跨域:

2. cas登录过程

3. cas 白名单?

背景:用户名、密码验证通过后,cas平台会跳转至 service 地址上。service 会有白名单,即仅能跳转至 cas 白名单地址上

问题:如果测试地址多有个,service 能否为 测试地址域名呢? An:可以,不建议。需要cas 白名单中添加多个测试地址~

4. same-site

google浏览器一直刷新 3. 更改配置:chrome://flags/#same-site-by-default-cookies

原因www.chromestatus.com/feature/508…

参考Cookie 的 SameSite 属性

问题1

【接入CAS】:

现象:登录完成后,页面一直刷新。咋回事?

浏览器地址:localhost:3000
背景:
1. 环境:后端两种环境stagging、preview,前端3种环境本地、stagging、preview
2. 本地存在跨域,项目中通过proxy解决跨域

思路:
1.访问API,request url:localhost:../api/meta/tablelist?pageSize=10&page=1
2.返回特定code
3.window.location=..login  =>  登录完成(1.当前域setCookie 2.返回ticket)
4.后端 localhost:... setCookie  => 返回前端页面
5.前端页面一直刷新

原因:后端validate方法:localhost下的cookie与ticket与config 与ticket比对,获取
不到用户信息  => 前端一直跳登录页

解决思路:
1. 后端增加一环境localhost(config中增加localhost, 例如:stagging,localhost)
2. 前端API访问stagging/api/...
- cors解决跨域
- 浏览器配置代理

【解决方式】

保证request url的域名种上cookie

  1. 配置代理 使用浏览器插件switchyOmega,配置代理

浏览器中访问:meta.dptest.pt.xiaomi.com

其实这种方式类似于更改windows下的host文件(尝试更改host,未成功哈~) 此时看,request url: meta.dptest.pt.xiaomi.com/api/...

  1. 后端解决跨域 我们后端通过CORS解决的跨域,前端无改动;

另外有一点需要注意的是: 规范中提到,如果 XMLHttpRequest 请求设置了withCredentials 属性,那么服务器不得设置 Access-Control-Allow-Origin的值为* ,否则浏览器将会抛出The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' fetch请求的地址,改成绝对路径地址:

可以啦!!

CORS跨域中遇到的坑:

后端一直获取不到origin,肿么办?

当跨域时,浏览器自动带上origin,获取不到,一定是后端的锅~

其实不是的,前端通过proxy代理了,导致fetch请求不存在跨域,故origin一直为空~

【总结】 项目中的小白问题,浏览器访问:a.com, 调用b.com/api/..., 可以带b.com的cookie吗? 可以的

问题2

未登录时,后端返给前端状态码?

原因:重定向存在跨域(参考:zhuanlan.zhihu.com/p/32662751)

前端本地环境、提测环境,访问的后端url地址 与 login地址不同,存在跨域

解决方式:

  1. 接口返回特定的code
  2. 浏览器配代理,fe、ui、qa均需要配置~