SSO单点登录简易认证流程

news2024/11/14 16:28:12
  • 流程说明

在这里插入图片描述

  • 导入依赖
          <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.16</version>
            </dependency>
  • 模拟代码

客户端

import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;

/**
 * @Author wf
 * @Date 2024/9/13 16:29
 * @Description: 客户端服务,模拟单点登录
 */
public class ClientServer {

    public static void main(String[] args) {
        // 创建 DES 对象
        DES des = SecureUtil.des(ExternalAPP.APP_ID.getBytes());
        //用户名,比如此处我们需要签发张三的Token
        String userName="张三";
        // 创建临时token需要携带的信息
        String tokenData =userName+"#"+System.currentTimeMillis();
        // 加密
        byte[] encryptedData = des.encrypt(tokenData.getBytes());
        String encodedEncryptedData = Base64.encode(encryptedData);

        //模拟请求sso服务器
        requestAuth(encodedEncryptedData);

    }


    /**
     * 模拟请求sso服务器获取用户Token
     *
     * @param token 代币
     */
    public static void requestAuth(String token){
        //此处模拟,通过客户端生成的Token,去请求sso服务器,获取正式Token
        SsoServer ssoServer=new SsoServer();
        String tokenData = ssoServer.getToken(token, ExternalAPP.APP_NAME);

        System.out.println("获取到的正式Token为:"+tokenData);
    }
}

服务端


import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.jwt.JWTUtil;
import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author wf
 * @Date 2024/9/13 16:03
 * @Description: token签发认证
 */
public class SsoServer {

    /**
     * 模拟数据库中存储的客户端列表
     */
    private static final Map<String, String> APP_MAP = new HashMap<String, String>() {{
        put(ExternalAPP.APP_NAME, ExternalAPP.APP_ID);
    }};

    /**
     * 获取指定用户的正式Token
     *
     * @param token   临时token
     * @param appName 应用名称
     * @return {@link String}
     */
    public String getToken(String token, String appName){
        String userName = authTemporaryToken(token, appName);
        if(StrUtil.isNotBlank(userName)){
            return issuanceToken(userName);
        }
        return "Token无效,或用户不存在";
    }


    /**
     * 认证临时Token
     *
     * @param token   临时token
     * @param appName 应用名称
     * @return {@link String} 需要签发Token的用户名
     */
    private  String authTemporaryToken(String token, String appName) {
        // 对临时token进行解密
        if (!APP_MAP.containsKey(appName)) {
            throw new RuntimeException("当前应用不存在,或无效");
        }
        // 创建 DES 对象
        DES des = SecureUtil.des(APP_MAP.get(appName).getBytes());
        // 解密
        byte[] decodedEncryptedData = Base64.decode(token);
        byte[] decryptedData = des.decrypt(decodedEncryptedData);
        String inscription = new String(decryptedData);
        if (StrUtil.isNotBlank(inscription)) {
            // 解析token中的信息
            String[] tokenArr = inscription.split("#");
            if (tokenArr.length == 2) {
                // 需要签发token的用户名
                String userName = tokenArr[0];
                // 临时token签发的时间戳
                String timeStamp = tokenArr[1];
                // 检查是否超过一分钟(60,000毫秒)
                boolean isOverOneMinute = (System.currentTimeMillis() - Long.parseLong(timeStamp)) > 60000;
                // 临时token没超过1分钟说明有效,可以给客户端签发正式Token
                if (!isOverOneMinute) {
                    return userName;
                }
            }
        }
        throw new RuntimeException("临时Token无效");
    }


    /**
     * 签发Token
     *
     * @param userName 用户名
     * @return {@link String}
     */
    private String issuanceToken(String userName){
        // token过期时间,1分钟
        Map<String, Object> tokenInfo = Maps.newHashMapWithExpectedSize(3);
        tokenInfo.put("userName", userName);
        tokenInfo.put("expireTime", System.currentTimeMillis() + 1000L * 60L );
        return JWTUtil.createToken(tokenInfo, "e14fb232-4c8d-4f20-bcd6-0b077f9131f4".getBytes());
    }





}

外部APP配置


/**
 * @Author wf
 * @Date 2024/9/13 15:56
 * @Description: 外部服务常量,模拟在服务中配置需要单点的应用,正常情况应该是存储在数据库中
 */
public class ExternalAPP {
    /**
     * 需要单点登录的应用标识,配置好之后暴露给对应客户端,固定8字节长度作为加密的key
     */
    public static final String APP_ID="weixin01";
    /**
     * 需要单点登录的应用名称
     */
    public static final String APP_NAME="微信";




}

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

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

相关文章

已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral

作者主页&#xff1a; https://yuheng.ink/ 论文标题&#xff1a; Pyramid Diffusion for Fine 3D Large Scene Generation 导读&#xff1a; 本文通过设计一种新颖的金字塔扩散模型&#xff0c;为三维室外场景生成提供了一种从粗到细的策略。本文对金字塔扩散模型进行了大量实…

云平台虚机卡顿问题分析

电信云中宿主机分配的虚机运行时出现卡顿问题,可能由多种因素导致。为了准确分析并定位原因,可以从以下几个方面进行排查: 1. 资源使用情况 检查CPU、内存和磁盘使用情况: 使用工具检查虚拟机的CPU、内存和磁盘使用情况,确认是否存在资源瓶颈。如果发现资源使用率较高,特…

4052A/4052B/4052C/4052D/4052E/4052F/4052G /4052H信号/频谱分析仪

4052A/4052B/4052C/4052D/4052E/4052F/4052G /4052H信号/频谱分析仪 苏州新利通 Ceyear 4052具备出色的测试动态范围、相位噪声、幅度精度和测试速度&#xff0c;具备频谱分析、I/Q分析、实时频谱分析、瞬态分析、矢量信号分析、脉冲分析、音频分析等丰富的测试功能。 Ceyear…

C++ | Leetcode C++题解之第400题第N位数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int findNthDigit(int n) {int d 1, count 9;while (n > (long) d * count) {n - d * count;d;count * 10;}int index n - 1;int start (int) pow(10, d - 1);int num start index / d;int digitIndex i…

【Elasticsearch】-7.17.24版本接入

官网 https://www.elastic.co/cn/downloads/elasticsearch 本项目基于windows环境下&#xff0c;其他环境操作类似 1、初始化配置 打开config/elasticsearch.yaml 添加如下配置 cluster.name: dams_clusternetwork.host: 127.0.0.1 http.port: 9200# 不开启geo数据库 inge…

【软件设计师真题】下午题第五大题---面向对象程序设计

系列文章目录 1.【软考之软件设计师】PPT课件 2.【软考之软件设计师】学习笔记 3.【软考之软件设计师】上午题—信管网(每天更新) 4.【软考之软件设计师】上午题—希赛网(每天更新) 5.【软件设计师真题】下午题第一大题—数据流图设计 6.【软件设计师真题】下午题第二大题…

小众语言ruby在苹果中的初步应用

前言 感觉Ruby在苹果系统中充当一种脚本语言来使用。 1、直接输入ruby没有反应 2、可显示结果的命令 ruby -e "puts Goodbye, cruel world!" 效果如下图&#xff1a; 说明苹果系统中ruby已经安装完毕&#xff0c;或者就是自带的。 3、编辑运行第一个ruby程序 输入…

手把手教你用护核纪元地心护核者用服务器开服联机

1、购买后登录服务器面板&#xff08;百度莱卡云面板&#xff09; 登录面板的信息在绿色的登陆面板按键下方&#xff0c;不是你的莱卡云账号 进入控制面板后会出现正在安装的界面&#xff0c;安装大约3分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、…

代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针

目录 二叉树基础深度和高度满二叉树和完全二叉树二叉搜索树和平衡二叉搜索树二叉树节点定义前中后序遍历 递归遍历前序递归遍历—144. 二叉树的前序遍历 迭代遍历层序遍历116. 填充每个节点的下一个右侧节点指针1、题目描述2、思路3、code 二叉树基础 深度和高度 满二叉树和完…

有JavaScript动态加载的内容如何抓取

引言 JavaScript动态加载的内容常见于现代Web应用中&#xff0c;用于增强用户体验和减少初始页面加载时间。然而&#xff0c;这些动态加载的内容对于传统的网页抓取工具来说往往是不可见的&#xff0c;因为它们不包含在初始的HTML响应中。为了抓取这些内容&#xff0c;我们需要…

Java项目: 基于SpringBoot+mybatis+maven星之语明星周边产品销售网站(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven星之语明星周边产品销售网站 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…

计算机中的浮点数(二)

IEEE 754-2008 标准(二进制) 计算机中的浮点数(一)-CSDN博客文章浏览阅读188次&#xff0c;点赞12次&#xff0c;收藏12次。这篇文章介绍了计算机系统中浮点数的正式定义&#xff0c;关于浮点数的介绍总共分两篇文章&#xff0c;这是第一篇。https://blog.csdn.net/daduzimama/…

动手学深度学习(pytorch)学习记录30-含并行连接的网络(GoogLeNet)[学习记录]

目录 GoogLeNetInception块GoogLeNet模型训练模型 GoogLeNet GoogLeNet&#xff0c;也称为Inception v1&#xff0c;是由Google团队在2014年提出的深度学习模型&#xff0c;它在当年的ImageNet竞赛中取得了显著的成绩。GoogLeNet的设计引入了多个创新点&#xff0c;包括Incept…

Spring Boot实战-文章管理系统(1.用户相关接口)

一、用户相关接口 1.注解 RestController&#xff1a;是一个组合注解&#xff0c;它结合了 Controller 和 ResponseBody 注解的功能&#xff08;就相当于把两个注解组合在一起&#xff09;。 在使用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或…

【数据结构】带你初步了解排序算法

文章目录 1. 排序的概念及运用1.1 概念1.2 运用 2. 常见的排序算法2.1 插入排序2.1.1 直接插入排序&#xff08;简单插入排序&#xff09;2.1.2 希尔排序 2.2 选择排序2.2.1 直接选择排序&#xff08;简单选择排序&#xff09;2.2.2 堆排序 2.3 交换排序2.3.1 冒泡排序2.3.2 快…

python | 2行命令解决pip模块不存在问题

一、报错情况 有时&#xff0c;在执行 pip 更新命令后&#xff0c;会提示更新失败或错误警告。 报错提示如下&#xff1a; 然后&#xff0c;再次使用 pip 安装命令时&#xff0c;会提示 pip 模块找不到或不存在&#xff1a; ModuleNotFoundError: No module named pip 导致…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天&#xff0c;越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段&#xff0c;能够帮助用户识别和检测IP代理的使用情况&#xff0c;从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

SQL数据库(MySQL)

一、在Ubuntu系统下安装MySQL数据库 1、更新软件源&#xff0c;在确保ubuntu系统能正常上网的情况下执行以下命令 sudo apt-get update 2、安装MySQL数据库及相关软件包 # 安装过程中设置root用户的密码 123456 sudo apt-get install mysql-server ​ # 安装访问数据库的客…

Rsync——远程同步

目录 一、rsync远程同步概述 1、rsync 简介 2、rsync的同步方式 3、rsync的备份方式 4、rsync与cp、scp对比 二、常用rsync命令 1、基本格式 2、配置源的两种表达方法 三、搭建rsync下行同步 1、搭建环境 2、配置rsync源服务器&#xff08;172.16.88.44&#xff09;…

出版学术专著需要具备哪些条件?

出版学术专著通常需要具备以下条件&#xff1a; 一、学术价值 1. 创新性 - 你的专著应在研究主题、方法、观点等方面具有一定的创新性。这可以是提出新的理论框架、发现新的现象、采用新的研究方法或对已有理论进行新的阐释和拓展。 - 例如&#xff0c;在某一特定学科领域中&…