关于内部网站跨域共享cookies实现多系统免登录解决方案
我的需求是,在网站a的后端获取到网站b的登录cookies,然后把cookies返回到网站a的前端,当从网站a的网页上点击网站b利用已经获取的cookies实现免登录
但是,由于浏览器的同源策略,我们无法通过JavaScript在网站A中直接设置网站B的cookies。同源策略要求我们只能设置当前域或父域的cookies,而不能设置其他域的cookies。
解决方法:我这里网站a的后端是django写的,网站b的后端使用java写的 网站b的登录验证
为cas验证,试了好多种方案,包括代理,outh2等等,最后解决方案如下
网站bcookies的获取方法,
1、通过爬虫模拟登录,使用session发送请求然后获取到cookies
2、把cookies放入到redis缓存数据库(也可以放到别的)使用用户名存储,因为每个用户登录信息不一样
#给第三方
@api_view(['GET', 'POST'])
def get_cache_data(request):
global user_global
data = cache_r.get(user_global)
if data is not None:
return Response(data)
#部分代码。根据自身需求进行更改
login_response = self.session.post(cas_login_url, data=login_data, params=params, allow_redirects=True)
# 检查登录是否成功 去掉浏览器地址栏多余的信息
if login_response.status_code == 200:
# 检查响应中是否包含登录成功的标识
if "登录成功" in login_response.text :
test_response = self.session.get(test_url)
if test_response.text:
return self.session.cookies, "登录成功"
else:
return False, "登录验证失败"
else:
return False, "登录失败:用户名或密码错误"
else:
return False, f"登录请求失败:{login_response.status_code}"
3、在网站b的服务器上弄一个代理服务,这里解释下为什么要弄第三方代理服务,因为,网站a和网站b由于浏览器默认限制不同源,属于跨域,我们不能够在网站a的前端把cookies放到网站b的端口上
代理服务使用nginx,也可以使用别的,更改下他默认html文件下的index.html,我们写一下获取cookies的代码和跳转网站b的操作
nginx 的conf配置
http {
include mime.types;
default_type text/html; # 调整默认类型为HTML
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 8086;
server_name localhost 网站b服务器的地址;
location / {
root html; # 指向HTML文件的根目录
index index.html; # 设置默认主页
}
}
}

const xhr = new XMLHttpRequest();
xhr.open('GET', '网站a');
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data); // 处理返回的数据
// 设置 JSESSIONID cookie
document.cookie = 'JSESSIONID='+data['JSESSIONID'];
document.cookie = "CASTGC="+data['CASTGC'];
// 设置 CASTGC cookie
window.location.href='网站b/cas-server/login'
}
};
当我们访问8086端口的网站自动跳转到网站b,并且实现网站B免登录
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)