我的需求是,在网站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免登录
 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐