统一认证服务升级

news/2024/10/18 4:27:45/

现状

项目概述

1.后端认证服务

提供注册/登录/用户信息管理

提供Token管理

2.前端登录-sdk

提供统一登录弹窗SDK

现有认证流程

在这里插入图片描述

登录SDK详解

  1. 登录项目提供了统一登录的login.js,其功能是提供统一的登录页面,封装回调函数(如点击事件回调,登录成功回调)
  2. 业务前端项目编写登录模块,创建登录弹窗容器,拉起login.js,实现回调函数业务逻辑,实际就是将login.js嵌入到了业务前端项目,本质就是一个项目内的逻辑交互
现有Token机制

生成Token

java">// 签名秘钥
String secret = "secret";
// 令牌附属信息
LoginTokenBo audience = new LoginTokenBo();
audience.setUserId(userBodyBo.getUserId());
audience.setTerminal(terminal.getValue());
long currentTimeMillis = System.currentTimeMillis();
audience.setStamp(currentTimeMillis);
// 令牌
String token = JWTUtil.newToken(secret, JSON.toJSONString(audience));
if (StringUtils.isBlank(token)) {// 生成令牌出错return StringUtils.EMPTY;
}// 将令牌写入到 Cookie(有效期:7 天)
final int expiry = 604800;
// 经令牌写入到 Redis
redisHelper.get(RedisDBIndexEnum.IDX36).setex(jointLoginTokenKey(userBodyBo.getUserId(), terminal), expiry, token);

验证Token

java">public int getLoginUserId(HttpServletRequest request) {int userId = 0;String token = getLoginCookieValue(request);if (StringUtils.isNotBlank(token)) {userId = getUserIdByNewCookie(token);}return userId;
}

销毁Token

java">public boolean  removeLoginState(HttpServletRequest request, HttpServletResponse response) {AtomicBoolean result = new AtomicBoolean(false);// 从新 Cookie 中获取用户信息,移除其登录状态String token = getLoginCookieValue(request);if (StringUtils.isNotBlank(token)) {extractLoginTokenAudienceBo(token).ifPresent(bo -> {int userId = getUserIdByNewCookie(token);if (userId > 0) {// 删除 CookieCookieUtil.setCookie(response, GeneralFields.LOGIN_COOKIE, StringUtils.EMPTY,GeneralFields.COOKIE_DOMAIN, 0, true);// 删除 redis 上存储的登录授权令牌GeneralTerminalEnum terminal = GeneralTerminalEnum.getByValue(bo.getTerminal()).orElse(GeneralTerminalEnum.PC_WEB);redisHelper.get(RedisDBIndexEnum.IDX36).del(jointLoginTokenKey(bo.getUserId(), terminal));result.set(true);}});}return result.get();
}

存在问题

  1. 目前Token在web端的存储方式为Cookie,某些浏览器开始禁用第三方的Cookie,导致我们的API客户出现无法登录的问题;
  2. 目前的认证方式只支持相同一级域名即chuangkit.com下的单点登录,不支持不同一级域名下的单点登录;
  3. 目前业务层与账号中心服务耦合严重,所有需要进行认证的接口都要RPC远程调用账号中心进行认证操作,代码重复开发,项目横向依赖。

目标

  1. 修改浏览器存储 Token 的方式为 LocalStorage,并且兼容历史 Cookie,解决三方Cookie被禁用的问题;
  2. 升级项目的认证令牌使用机制,支持不同一级域名下的单点登录;
  3. 搭建API网关,统一接口认证,认证通过后将用户信息携带给下游服务,消除服务间的横向依赖及代码重复的问题;

实现方案

如何实现不同域名下的单点登录,比较成熟的方案:自主实现、CAS、OAuth2等,其核心流程都是定义一个认证中心,认证中心负责用户的注册/登录以及自己域下的用户登录态维护,其它服务需要登录时跳转到认证中心,认证中心判断用户在自己域下是否有登录态,没有则先需要登录,有则携带token重定向回业务服务,业务服务拿到token后保存到自己的域下,然后请求业务接口。

方案对比:

自主实现CASOAuth2
复杂度简易一般复杂
Token存储方式兼容Cookie,支持LocalStorage只支持Cookie支持Cookie,LocalStorage
标准化一般较高,开源项目强,开放的标准协议
适用性适用,自主实现,从现有项目过渡相比其它来说较为便捷,比较适合小型项目不适用,基于cookie,支持localStorage的话需要二开,很多功能用不到基于OAuth2,概念多,使用场景全比较复杂,该方案实现的话改动较大,并且前后端需要对其有一定的了解,同时是一个标准协议,通用型较高
接入难度一般,单Token模式CAS Server只能单独部署官方提供的war包,适合从0到1。较高,双Token模式(accessToken和refreshToken)
推荐程度建议不建议人员/时间充足的情况下建议
实现方案:

完整流程:
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=%2FUsers%2Fwangxt%2Fmyspace%2Fwxt%2F%E5%9B%BE%E7%89%87%2F%E8%AE%A4%E8%AF%81%E6%B5%81%E7%A8%8B%E5%8D%87%E7%BA%A7.png&pos_id=img-LMPNIsAI-1728789321451

前端SDK细节流程:

  1. 前边提到login.js作为一个拓展功能,哪个业务前端引入便跟随其部署在哪个项目里,这样login.js只能往当前前端项目所属域名下操作,无法实现多域名的交互,所以需要单独部署一个登录页面的项目,login.js负责和登录页面进行认证相关交互,业务前端系统仍然只需要实现相关回调方法即可,无需关注登录相关细节。
    在这里插入图片描述

http://www.ppmy.cn/news/1539896.html

相关文章

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID,BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID),BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节):由16位(2字节)的桥优先级…

SpringBoot原理(续)

上篇博客在跟踪SpringBoot自动配置的源码的时候,在自动配置类声明bean的时候,除了在方法上加了一个Bean注解以外,还会经常用到一个注解,就是以Conditional开头的这一类的注解。以Conditional开头的这些注解都是条件装配的注解。下…

详解Oracle审计(二)

题记: 本文将承接上篇详细介绍oracle的审计功能,基于11g版本,但对12c,19c也同样适用。 1. 语句审计实操演示实例 sqlplus / as sysdba show parameter audit_trail alter system set audit_traildb_extended scopespfile; star…

在Linux中搭建WordPress并实现Windows主机远程访问

WordPreWordPress是一个基于PHP开发的开源平台,适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时,它也能够作为功能强大的内容管理系统(CMS)被广泛应用。 虚拟机:VirtualBox 虚拟机安装&#x1f449…

如何在Android平板上使用谷歌浏览器进行网页缩放

在使用Android平板时,我们经常会浏览各种网页,但有时网页内容可能无法适应屏幕大小,这时就需要用到网页缩放功能。本文将为您详细介绍如何在Android平 板上的谷歌浏览器中进行网页缩放,帮助您更好地浏览网页。(本文由h…

状态机与行为树的实现;Behavior Designer的使用与自写状态机的几种方法;

以下部分内容将会涉及插件BehaviorDesigner 代码仅为演示所需,并非实际实现代码,非本人所使用代码; 前往个人博客,获取更好的阅读体验 状态机与行为树 为何写? 笔者在初学的时候并不写状态机,而是写到一…

Unity-Shader-语义

1、从程序传给顶点函数: POSITION:顶点坐标(模型空间下) NORMAL:法线向量(模型空间下) TANGENT:切线向量(模型空间下) TEXCOORD0~n:纹理坐标 …

设计模式概览

设计模式是一种解决常见编程问题的经验总结,提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个,主要分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解: 一、创建型模式 创建…