多域名实现单点登录详解

news2024/9/22 1:10:50

Hi I’m Shendi


多域名实现单点登录详解




简介

在很久以前给自己的网站制作了登录系统,但因为个人备案等原因没有需要用到登录的地方,于是就没有特意去完善这部分功能,仅仅是将用户部分抽取出来作为一个微服务

最近编写一个转换工具,调后端接口,为了避免被恶意调用,除了使用验证码外,还需要登录才能使用

因为是微服务,项目是多个,为了保证良好的体验,于是将单项目登录更改为单点登录

因为这部分我没有做过,于是首先从网络上查阅相关信息来借鉴,在我n次搜索尝试后,终于放弃了,大抵都是废话一大片,甚至还有的在误导他人,比如不同域名之间使用session做单点登录…毫无收获,只能自己琢磨,于是在这里记录下来



单点登录(SSO)

传统登录在一个项目登录后,在另一个项目状态是未登录,而单点登录是在一个项目登录,所有项目都为登录

例如有两个项目,a.com 与 b.com

用户在 a.com 登陆后,直接访问 b.com,b.com的状态也是登录


可以进入我的网站体验一下效果

目前我自己尝试在一个项目登陆后其他项目也都登录,一个项目退出登陆后所有项目都退出登录,如果发现bug可以通过发送email至shendi@sdpro.top提醒我一下~

  • sdpro.top
  • tool.sdpro.top


思路

在之前,我是通过点击按钮的方式切换项目登录,这种方式不是单点登录,但可以在项目跳到另一个项目时保持登录状态

后面我思来想去发现要实现单点登录只能使用中间页的方式,主要重心在前端的存储数据部分,只要能够多个项目可以共享登录数据,那就实现了单点登录了


对于浏览器来说,存储数据大致只有 cookie,storage


如果将多个项目都放在一个域名下的话(单域名),那可以使用cookie,和传统登录没啥太大的区别

一个域名的子域名貌似也能共享Cookie,不过对我来说,我已经弃用了cookie(因为有的小程序不支持cookie),使用的Token,于是只能使用 storage,而localstorage的作用域是在当前域名,域名不一致就拿不到数据。

于是制作一个页面作为中间页,将登陆注册操作都放到这个页面。

那么如何判断是否登录?这就需要做很多操作,其他项目的页面在一开始要跳到中间页,在中间页内判断是否登陆,登录就传递一些信息回去…

最开始我想到的是使用iframe,因为iframe可以使用parent来修改父窗口的内容,在iframe加载中间页,是登录的话调用父窗口的某函数或更改属性值告诉父窗口状态为登陆…但经过尝试,这样只能在域名相同的情况下使用,域名不同就会爆跨域

最后只能使用重定向的方式,重定向传递参数只能通过url传递…

总的来说就是通过一个中间页存储登录信息,其余项目通过中间页来获取登录信息

这里画一个简陋的图来描述一下意思

在这里插入图片描述


其中用户微服务与中间页相当于中央认证系统CAS(Center Authentication Service)



实现

为了确定可行性,我首先制作了个demo示例,两个页面放在不同域名下,主要是前端不同项目之间的数据共享实现

项目页面(url包含info代表已登录,未登录跳中间页)

<html>
<body>
    wqeqweqwe
<script>
    if (location.href.indexOf("info") != -1) {
        console.log("已登录");
    } else {
        location.href = "中间页?url=" + location.href;
    }
</script>
</body>
</html>

中间页

<html>
<body>
<script>
    location.href = location.href.substring(location.href.indexOf("url=")+4,location.href.length) + "?info=123";
</script>
</body>
</html>

浏览器打开尝试后效果还算可以,剩下的就是逻辑部分了,这里直接做总结了

用户微服务(后端)

  • 使用token,用户登录/注册后拿到token,后续操作携带token则可通过登录验证
  • 提供登录/注册/登出接口等

项目页

  • 首先判断本地是否有登录信息

    • 代表已登录(有可能登陆超时等,这个需要自行去处理,例如记录创建时间,超过就代表失效,或请求后端后端告知登陆已失效…,失效就跳中间页)
    • 携带当前页面地址跳中间页面(这个是必须的),还可以传递更多信息,例如清除登录信息之类的
  • 退出登录同样跳中间页,携带格外的参数通知即可


中间页

  • 本地是否有登录信息,登录信息是否超时/失效
  • 登陆有效
    • 携带登录信息重定向传递的页面地址参数
  • 登陆无效
    • 停留本页作为登录页面或带代表登陆无效的参数重定向回去

注意事项

因为是重定向,url链接长度有大小限制,不同浏览器限制不同,大概是2000多字符,所以如果数据很多的话,可以将数据存到后端,后端返回标识然后在后端拿到数据




最后,有一点不好的就是浏览器的url部分会跳来跳去的,但不关注url的话是无感刷新的




END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unittest教程__认识unittest(1)

unittest是python内置的单元测试框架&#xff0c;具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件。 使用unittest前需要了解该框架的五个概念: 即test case&#xff0c;test suite&#xff0c;test loader&#xff0c;test runner&#xff0c;test fixture。 …

【多线程】锁策略、CAS、Synchronized

目录 常见的锁策略 乐观锁 vs 悲观锁 悲观锁: 乐观锁&#xff1a; 读写锁 重量级锁 vs 轻量级锁 自旋锁&#xff08;Spin Lock&#xff09; 公平锁 vs 非公平锁 可重入锁 vs 不可重入锁 CAS 什么是 CAS CAS 是怎么实现的 CAS 有哪些应用 1) 实现原子类 2) 实现自…

从0到1使用NodeJS编写后端接口的实战案例(仅供参考)

目录 一、项目简介 1、使用技术 2、实现的主要功能 3、项目结构 二、开发环境准备 1、安装node.js 2、安装 MYSQL 数据库 3、安装 node.js 的 mysql 驱动 4、安装 Express 框架 5、Node 格式化时间模块Silly-datetime 6、安装 nodemon 三、后端代码 1、入口文件 —…

帝国cms城市分站系统开发:首页友情链接和分站友情链接分开调用

第一步&#xff1a;phome_enewslink 增加myarea字段 字段类型&#xff1a;int&#xff0c;长度6&#xff0c;非null字段&#xff0c;默认值0 或者在帝国cms后台执行 sql语句&#xff1a; alter table [!db.pre!]enewslink add myarea int(6) not null; 第二步&#xff1a;修…

二次封装NavLink(React实现)

实现思路&#xff1a; 1、定义一个普通组件 2、普通组件内使用NavLink 3、传递参数给定义的普通组件并实现效果 代码实现&#xff1a; App.jsx import React, { Component } from "react"; import About from "../src/Pages/About"; import Home fro…

Vivado全版本下载分享

Vivado是由Xilinx公司开发的一款用于FPGA设计和开发的综合设计环境。它包括了高层次综合&#xff08;HLS&#xff09;、逻辑设计、约束管理、IP核管理、仿真、综合、实现和调试等功能&#xff0c;支持面向最新FPGA器件的设计。 这里分享一下Vivado的电脑安装配置推荐&#xff…

性能测试调优模型、思想和技术

最近阅读《软件性能测试、分析与调优实践之路》一书&#xff0c;个人认为性能调优章节为整部书的精华&#xff0c;该章节包括了性能测试调优模型、调优思想和调优技术。下面是摘抄整理自书中内容&#xff1a; 调优模型 下图为互联网中常见的用户请求的分层转发和处理的过程&a…

Echarts前端可视化库使用教程

Echarts介绍 ECharts是一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xff0c;Firefox&#xff0c;Safari等&#xff09;&#xff0c;底层依赖矢量图…

XSS跨站脚本攻击及防护

目录 一、初识XSS跨站脚本 1.1 XSS玫击概述 1.2 XSS漏洞攻击本质 1.3 XSS攻击的危害 1.4 XSS玫击原理 1.5 XSS攻击过程 1.6 XSS攻击特点 1.6.1 间接攻击 1.6.2 可更正性 1.6.3 传播性强 二、XSS攻击与防护 2.1 XSS攻击分类 2.1.1 存储型XSS 2.1.2 反射型XSS 2.1…

OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算

1. 形态学2. 常用接口2.1 cvtColor()2.2 图像二值化threshod()自适应阈值二值化adaptiveThreshod() 2.3 腐蚀与膨胀erode()getStructuringElement()dilate() 2.4开、闭、梯度、顶帽、黑帽运算morphologyEx() 1. 形态学 OpenCV形态学是一种基于OpenCV库的数字图像处理技术&…

React学习笔记(二)组件详解(上)

一、组件的概念&#xff1a; 当你开始学习 React 的时候&#xff0c;你会了解到 React 组件是 React 应用程序的基本构建块。组件是一个隔离的、可重复使用的代码块&#xff0c;由 HTML 元素、其他组件或自定义的 UI 元素组成&#xff0c;组件也就是react的核心思想&#xff0c…

python Flask web项目uwsgi + nginx部署

1.安装python 略 2.虚拟环境 2.1安装vertualenv pip3 install virtualenv2.2创建虚拟环境 创建保存环境的目录&#xff1a; mkdir venvs创建虚拟环境&#xff1a; [rootroot /]# virtualenv /home/xxx/venvs/flask2 --pythonpython3查看虚拟环境&#xff1a; [rootroot…

破万亿!英伟达的市值

文章目录 破万亿 &#x1f928; 英伟达的市值&#x1f928; 英伟达市值几近破万亿&#x1f916; ChatGPT 伪造 6 个法律案例&#x1f5e1;️ AI 巨头的呼吁&#xff0c;是真担心还是想垄断&#xff1f;&#x1f3e0; 硅谷诈骗犯开启女性监狱新家&#x1f4c8; 美国房价春季反弹…

有趣的图(五)(59)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 咱们今天继续学习图的应用&#xff0c;这些算法都是实际问题抽象出来的。 举个例子吧&#xff01; 下面6个城市&a…

第八章ThreadLocal

文章目录 先看面试题什么是ThreadLocal能干嘛基本使用常用方法 使用ThreadLocal来解决使用sychronized解决ThreadLocal与synchronized的区别 强化理解数据隔离的意义为什么线程执行完要remove 运用场景_事务案例场景构建 引入事务JDBC中关于事务的操作的api常规解决方案常规方案…

javascript程序员简历模板(合集)

javascript程序员简历模板一 个人资料 姓 名&#xff1a; 性 别&#xff1a; 女 年 龄&#xff1a; 21 民 族&#xff1a; 汉族 户籍&#xff1a; 湖北 襄樊 最高学历&#xff1a; 本 科 现所在地&#xff1a; 广东 广州 毕业院校&#xff1a; 南京理工大学 所学专业&#xff1…

忘记 localStorage 吧,indexedDB 才是前端存储新宠!

前言 在项目开发过程中&#xff0c;前端需要存储大量的数据。cookie, localstorage 都有存储长度限制。表格一览 特性cookielocalStoragesessionStorageindexedDB数据生命周期一般由服务器生成&#xff0c;可以设置过期时间&#xff1b;前端采用和js-cookie等组件也可以生成除…

带货、文案策划看过来-让GPT30秒内帮你写出世界顶级文案

开篇 在这个充满竞争的市场环境中,一句响亮的品牌短语,往往能让消费者对你的品牌印象深入脑海。俗话说:“言短意赅,反而显得深邃。”这不正是品牌短语的形式特点吗?而这种言简意赅、朗朗上口的品牌短语,在中国市场上就显得尤为重要。因为它直击心灵,与消费者之间一夕之…

Fiddler 八个实用技巧

大家对Fiddler应该不会陌生&#xff0c;但里面有些技巧不见得都会&#xff0c;这里就有八个实用技巧&#xff0c;通过对Fiddler的定制&#xff0c;能提高大家的测试效率。 1、双击Session时&#xff0c;使响应页始终显示到”json”tab页&#xff1b;使请求页始终显示到“webfo…

【LLM GPT】李宏毅大型语言模型课程

目录 1 概述1.1 发展历程1.2 预训练监督学习预训练的好处 1.3 增强式学习1.4 对训练数据的记忆1.5 更新参数1.6 AI内容检测1.7 保护隐私1.8 gpt和bert穷人怎么用gpt 2 生成式模型2.1 生成方式2.1.1 各个击破 Autoregressive2.1.2 一次到位 Non-autoregressive2.1.3 两者结合 2.…