通过伪代码结合理论模拟pc端接入单点登录(Oauth2浙里办)

news2024/11/18 13:29:45

前言

还记得那是一个惺忪的早晨,带着困意的我正准备去公司上班,坐车坐到一半,钉钉突然袭来一条红色预警信息,公司查出来有个人阳了,好消息:万幸我还在去公司的路上,没有和他有过多的接触,坏消息:那个人的工位离我不过3米远,内心os:我靠,没办法这种情况也只能打道回府了,开始了为期快一个月的居家办公生活,即使居家了也没能阻止我成为小洋人,万幸症状不严重,熬过了那段时间之后,慢慢的也恢复从前的生活了。

pc端接入单点登录

本人由于对接的是pc端的浙里办登录,先说下思路吧,先去申请一个 IRS 组件,之后去找浙里办那边的技术人员让其通过一下,然后他们会给我们一个 appid ,看到这个 appid 就知道他们单点登录是通过 Oauth2 协议实现的了,然后我们携带好 appid 去访问他们提供的单点统一登录的地址就行,https://portal.zjzwfw.gov.cn/uc/sso/login?appId=xxxxx,注意这是对接的 pc 端,这个地址只能通过浏览器地址栏输入的形式进行访问,然后浙里办收到单点登录请求之后,会返回一个 ticketId 请求重定向到我们系统,至于票据 ticketId 的接收,我们自己系统可以通过接口接收、或者通过一个页面接收,由于对接的是 pc 端,我们这里采用页面接收,页面接收到 ticketId 后,拿着 ticketId 去请求我们自己的接口,接口通过 ticketId 去请求 token 返回 token 给我们的页面,获取 token 成功后,然后通过 token 去获取用户信息,如果该浙里办用户绑定过我们系统的账号,最终才能进入系统,否则跳转到账号绑定页面。

实现流程大概就是上文描述的这样了,接下来说一下大家对单点登录理解起来比较绕的点吧

  1. 回调地址是什么东西?系统 a 发起一个请求到系统 b,系统 b 收到请求后,将请求重定向回系统 a ,这个重定向地址就是回调地址。该怎么配置回调地址呢?找一台公网可访问的服务器,将服务部署到上面,这个回调地址可以是一个接口,也可以是一个公网可访问的页面,然后把对应的访问地址告知系统 b 即可。这样当系统 a 访问 b 系统的统一登录地址时,b 系统就知道将票据 回调给哪个地址了。拿到了票据后,就可以进行接下来的一系列操作了。浙里办是分公网、政务云环境的,各位根据自己系统所在的环境来就行,总之就是要让系统 b 可以访问到系统 a 的那个回调地址。
  2. 回调地址配页面还是接口? 拿浙里办pc端的单点登录来说,由于pc端浙里办登录的口子,只能通过浏览器输入url访问,如果想要实现用户登录了浙里办,再次访问我们系统,免登就可以进入系统的效果,那么这种情况下我们系统原有的登录页是要舍弃的。原因很简单,前端如果采用发请求的方式去请求浙里办统一登录页面,当用户没有登录的时候,浙里办那边那个请求已经被重定向到浙里办登录页了,但是此时前端 api 的限制,无法进行重定向,只能干瞪眼看着一个 302 状态码,却无法进行重定向的操作哦。回调接收页面的逻辑很简单,就是在加载页面的时候重定向到浙里办的登录页即可,这样一来所有的系统登录页都统一了,也就实现了单个系统登录,其他系统无需登录的效果了。
  3. 如果pc端即想要保留自己的用户体系登录页、也想接入浙里办单点登录可以在原有的登录页上面加一个浙里办登录的口子,口子 url 填写 https://portal.zjzwfw.gov.cn/uc/sso/login?appId=xxxxx 这个地址就行,供用户选择登录方式,如果用户登录过浙里办,点击我们系统的浙里办登录口子就直接跳转进入系统了,没有登录过,会走 Auth2 认证授权那一套登录逻辑。不了解 Oauth2 的小伙伴可以移步,结合源码剖析Oauth2分布式认证与授权的实现流程

实战模拟加深理解

系统a:端口号 8082,接下来的内容意在编写伪代码,模拟上述过程加深理解,系统 a 回调页面模拟代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>单点登录</title>
</head>
<body>
中间页
<script>
    window.onload = function load() {
        const searchParams = new URLSearchParams(window.location.search);
        const ticketId = searchParams.get("ticketId"); // 从url参数获取ticketId
        //地址栏有票据
        if (ticketId) {
            //根据票据获取token
            fetch(`/auth/getTokenByTicketId?ticketId=` + ticketId, {
                method: 'post'
            }).then(response => {
                return response.text();
            }).then(result => {
                //根据token获取用户信息
                fetch(`/auth/getUserInfoByToken?token=`+result, {
                    method: 'post'
                }).then(response => {
                    return response.json();
                }).then(result => {
                    console.log('user info==', result);
                })
            })
        }
        //地址栏无票据,跳转至统一登录页
        else {
        	//直接重定向至统一登录页
            //window.location.href = "http://localhost:8080/auth/zw/appid=111";
            //模拟通过发起请求,去访问统一登录页
            fetch(`http://localhost:8080/auth/zw/appid=111`, {
                method: 'get'
            }).then(response => {
                return response.text();
            }).then(result => {
                console.log(result);
            })
        }
    }
</script>
</body>
</html>

系统 a 获取 token、用户信息接口:

@Slf4j
@RestController
@RequestMapping("/auth")
public class AuthController {
    @PostMapping("/getTokenByTicketId")
    public String dologin(@RequestParam("ticketId") String ticketId) {
        if (!"zzh".equals(ticketId)) return "通过此ticketId获取token失败,无效ticketId";
        log.info("-------发起请求调用浙里办获取token接口 api 获取到的 token为:token-----");
        return "token";
    }
    /**
     * 获取用户信息
     */
    @PostMapping("/getUserInfoByToken")
    public String userInfo(@RequestParam("token") String token) {
        log.info("-----调用浙里办获取用户信息接口,获取用户信息-----");
        if (token != null && "token".equals(token)) {
            return "通过该token成功获取到用户信息。";
        } else {
            return "无效token";
        }
    }
}

浙里办后端模拟代码

很简单的一个模拟,主要分二种情况

  1. 用户登录过浙里办,携带票据重定向到系统 a 的回调页(系统 a 的回调接口)上面
  2. 用户没有登录浙里办,跳转到浙里办登录页。
@Slf4j
@RestController
@RequestMapping("/auth")
public class AuthController {
    /**
     * 浙里办模拟重定向到回调地址,并且附ticketId
     */
    @CrossOrigin
    @GetMapping("/zw/{appid}")
    public void zw(@PathVariable("appid") String appid, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.err.println("-------appid-------" + appid);
        response.setHeader("Access-Control-Allow-Origin", "*");
        //重定向到系统 a 配置的回调页面
        //response.sendRedirect("http://localhost:8082/mid.html?ticketId=zzh");
        //重定向到系统 a 配置的回调接口上
        //response.sendRedirect("http://localhost:8082/auth/test/569a1529886e47f8a5f807ab3133b541");
        //重定向到浙里办登录页
        response.sendRedirect("http://localhost:8080/auth/index");
    }
    @CrossOrigin
    @GetMapping("/index")
    public String d(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        return "浙里办登录页";
    }
}

模拟-前端通过发起请求的方式去访问统一登录页

可以看到我们的请求得到的反馈是 302(请求重定向),此时的前端只能得到重定向页面的整个页面源码,无法手动重定向!!!!!!,因此 pc 端去通过发起请求的方式去访问浙里办统一登录页,无法手动跟随重定向,这也是为什么 pc 端只能用浏览器输入url去访问统一登录页面的原因!!!!!
在这里插入图片描述
在这里插入图片描述

模拟-前端通过浏览器输入url方式访问统一登录页

修改回调页面代码再次进行测试

在这里插入图片描述

可以看到重定向成功

在这里插入图片描述

模拟-带票据访问回调页

可以看到成功获取到用户信息,之后的接入大家的业务逻辑就可以了。

在这里插入图片描述

总结

pc 端统一登录的口子,切记使用浏览器输入 url 的方式去访问,不然对于返回的 302 状态码,前端无法手动跟随重定向,如果你此时对接的单点登录,他们提供了工具类并有方法去检测用户是否登录,登录了则返回票据,未登录返回一个状态码啥的,此时前端就无需考虑这么多了,后端就写本文的那俩个接口就行,前端的逻辑无非就是通过提供的工具类,当用户访问系统 a 的时候,去检测用户是否已经登录,未登录跳转到统一登录页,登录过拿到票据去请求本系统中的接口走如下流程即可。

在这里插入图片描述

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

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

相关文章

机器学习中的数学原理——对数似然函数

这个专栏主要是用来分享一下我在 机器学习中的 学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎 私信或者评论区留言&#xff01;这一篇就更新一下《 白话机器学习中的数学——对数似然函数》&#xff01; 目录 一、什么是对数似然函数…

SD卡打不开怎么办?sd卡损坏修复,盘点一些实用的教程

SD卡的应用十分广泛&#xff0c;比如&#xff0c;手机、数码相机、摄像机、MP4、航拍器、车载导航等。但是随着SD卡的使用时间的长短&#xff0c;有时会出现常见问题—SD卡打不开。SD卡里面保持着我们很多重要数据&#xff0c;如果它打不开&#xff0c;很可能导致我们里面重要数…

CSS倒影炫酷属性 -webkit-box-reflect 的使用

文章目录效果预览一、相关知识点介绍属性相关二、实现步骤总结效果预览 一、相关知识点 介绍 文档 MDN关于倒影属性介绍&#xff1a;https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-box-reflect 官方说明&#xff1a; 非标准:该特性是非标准的&#xff0c;不在标…

CCF BDCI|算能赛题决赛选手说明论文-05

基于TPU平台实现人群密度估计 队伍&#xff1a;SO-FAST 宋礼 算法工程师 京东科技 中国-北京 song200626163.com柯嵩宇计算机科学与技术专业 博士 上海交通大学 中国-上海 songyukesjtu.edu.cn包锴楠计算机科学与技术 硕士 西南交通大学 中国-成都 baokainan123gmail…

元宇宙构建基石:三维重建技术

如今“元宇宙”概念爆火&#xff0c;作为前沿数字科技发展的集成体之一&#xff0c;元宇宙正成为诸多产业寻求破局的全新风口。元宇宙是利用科技手段进行链接与创造&#xff0c;与现实世界映射和交互的虚拟世界&#xff0c;具备新型社会体系的数字生活空间&#xff1b;其本质上…

Day11 蓝桥杯+Java中LocalDate类——关于日期跳转题【2015省赛星系炸弹】(相比C++,Java的LocalDate是真的香!!!)

今天刷蓝桥杯的题&#xff0c;用CAC了之后&#xff0c;发现解析里有兄弟用Java的LocalDate类做的&#xff0c;步骤极其简洁&#xff0c;【由于寒假开始学过一点Java】所以我特意去搜了搜LocalDate类&#xff0c;发现解这种题真的很好使&#xff01;&#xff01;&#xff01;废话…

高级性能测试系列《39.终极线程组可以模拟出压力测试场景吗?》

一、回顾1.面向目标场景&#xff1a;Arrivals Thread Group&#xff0c;这个可以面向tps。Concurrency Thread Group&#xff0c;可以设置面向多少个并发用户数。2.波浪型场景&#xff1a;Ultimate Thread Group 波浪型场景。在添加第二行时&#xff0c;初始化时间点要大于等于…

Makefile的使用 和 基本语法 及Makefile中变量的使用【入门必看】

MakefileMakefile概要为啥要使用MakefileMakefile的使用Makefile的语法&#xff08;重点&#xff09;Makefile实际使用&#xff08;重点&#xff09;利用Makefile删除详解Makefile指令&#xff08;重点&#xff09;Makefile多命令选项Makefile的选择编译特性强制执行总结Makefi…

使用 Keras 深度学习库进行CNN 图像识别

Keras 是一个用于深度学习的 Python 库&#xff0c;它封装了强大的数值库 Theano 和 TensorFlow。 在本文中&#xff0c;你将了解如何在 Keras 中开发和评估用于图像识别的深度学习模型。完成本文后&#xff0c;你将了解&#xff1a; 关于 CIFAR-10 对象分类数据集以及如何在…

Pyrene-PEG5-propargyl_1817735-33-3_芘甲酰胺五聚乙二醇丙炔

Pyrene-PEG5-propargyl&#xff0c;芘甲酰胺-五聚乙二醇-丙炔Product structure&#xff1a;Pyrene-PEG5-propargyl结构式Product specifications&#xff1a;1.CAS No&#xff1a;1817735-33-32.Molecular formula&#xff1a;C30H33NO63.Molecular weight&#xff1a;503.64.…

一文弄懂三色标记算法

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 你愈是少说你的伟大&#xff0c;我将愈想到你的伟大。——培根 文章目录三色标记算法增量更新原始快照面试官&#xff1a;我们先从JVM基础开始问&#xff0c;了解三色标记算法吗&#xff1f;我&#xff1a;额…

CSS或JS实现逐帧动画方案

什么是逐帧动画 逐帧动画是一种在连续的关键帧中分解动画动作&#xff0c;即在时间轴的每一帧上绘制不同内容并使之连续播放成动画的一种常见的动画形式。与CSS关键帧动画不同的是&#xff0c;逐帧动画每一帧需要自行定义&#xff1b;关键帧动画只需定义部分关键帧&#xff0c;…

《机会成本》的阅读札记

【引子】第一次接触机会成本&#xff0c;大约还是十几年前自己在读MBA的时候&#xff0c;在徐华老师《管理经济学》的课上听到过一耳朵&#xff0c;但没有太多的认知。这个春节&#xff0c;阅读了《机会成本——做出高效决策的策略思维》才有了些许进一步的认识&#xff0c;那么…

从0到1介绍一下开源大数据服务平台dataService

1.背景&现状 在大数据领域也已经工作了多年&#xff0c;无论所待过的大公司还是小公司&#xff0c;统计出来的数据经常需要查询展示&#xff0c;比如说&#xff1a;用做大屏或者报表或者给一些线上服务提供数据源&#xff0c;经常会要用代码写一套接口服务&#xff0c;需要…

Python中的os模块

整理文件和目录最最最常用的os模块os模块是Python标准库中整理文件和目录最为常用的模块&#xff0c;该模块提供了非常丰富的方法用来处理文件和目录。os.getcwd()作用&#xff1a;获取当前的工作路径&#xff1b;>>> os.getcwd() D:\\ResearchWay\\Code\\PythonCode\…

2023年浏览器哪个好,如何选择浏览器?

浏览器作为电脑必备的软件之一&#xff0c;相信绝大多数人都用过。选择一款好用的浏览器&#xff0c;可以帮助我们提升工作效率。那么&#xff0c;浏览器哪个比较好&#xff0c;我们如何选择合适的浏览器&#xff1f;为了找到集速度、易用性、安全于一身的浏览器&#xff0c;我…

第四十七章 动态规划——状态压缩模型

第四十七章 动态规划——状态压缩模型一、什么是状态压缩二、例题讲解1、AcWing 1064. 小国王&#xff08;1&#xff09;问题&#xff08;2&#xff09;思路&#xff08;3&#xff09;代码2、AcWing 327. 玉米田&#xff08;1&#xff09;问题&#xff08;2&#xff09;思路&am…

晴天科技冲刺上市:实控人丁一波系本科肄业,粤民投为其股东

近日&#xff0c;浙江晴天太阳能科技股份有限公司&#xff08;下称“晴天科技”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市。据贝多财经了解&#xff0c;晴天科技曾于2022年7月1日递交招股书&#xff0c;此次更新了截至2022年6月30日的财务数据等信…

AcWing 1072. 树的最长路径(DFS)

[TOC](AcWing 1072. 树的最长路径&#xff08;树形DP)) 一、题目&#xff1a; 二、思路&#xff1a; 为了方便&#xff0c;我们利用下面这个图做讲解&#xff1a; 这颗树的最长路径必定经过的是图中的点&#xff0c;因此&#xff0c;**我们可以去枚举经过图中每个点的最长路…

微星武士gf66电脑系统中途安装失败怎么办?

微星武士gf66电脑系统中途安装失败怎么办&#xff1f;有用户购买的微星武士gf66电脑想要进行电脑系统的重新安装&#xff0c;但是在新系统的安装过程中出现了错误&#xff0c;导致系统无法启动了。这个情况可以使用U盘来重装一个系统&#xff0c;恢复电脑的正常使用&#xff0c…