jwt单点登录

 一、前言

在我们日常开发中登录是每个系统都要做的,对于单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

开一下传统登录:

单点登录:

 

通俗讲:用户登录一次,就可已访问系统里的其他子系统。 

二、JWT是什么


1.JWT的概况


通俗讲:就是一种生存字符串的规则叫JWT。JWT是JSON WEB TOKEN的缩写,它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。

 Token(令牌)属于无状态,因每个人制定的规则不同,生成的结果也不同。目前,多数人采用JWT为统一令牌标准,之后我也采用JWT作为token生成标准。

2.JWT的组成


jwt实例可以在该网站上获得解析结果:JSON Web Tokens - jwt.io

组成: 

 该对象为一个很长的字符串,字符之间通过"."分隔符分为三个子串。

 每一个子串表示了一个功能块,总共有以下三个部分:JWT头有效载荷签名

JWT头:

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。

{
    "alg": "HS256",
    "typ": "JWT"
}

 

在上面的代码中,

alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);

typ属性表示令牌的类型,JWT令牌统一写为JWT。

最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

有效载荷【用户信息】:

(通俗的讲就是用户信息)有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

上默认字段外,我们还可以自定义私有字段,如下例:

{
    "userId": "1234567890",
    "name": "zhangsan",
    "admin": true
}

 

请注意,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。

JSON对象也使用Base64 URL算法转换为字符串保存。

签名哈希【防伪标志】:

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
 

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)

Base64URL算法:
如前所述,JWT头和有效载荷序列化的算法都用到了Base64URL。该算法和常见Base64算法类似,稍有差别。 作为令牌的JWT可以放在URL中(例如api.example/?token=xxx)。 Base64中用的三个字符是"+","/“和”=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"=“去掉,”+“用”-“替换,”/“用”_"替换,这就是Base64URL算法。

3.JWT的用法


客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。

此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。当跨域时,也可以将JWT被放置于POST请求的数据主体中。

4.JWT优缺点

  • JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。
  • 生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
  • 存储在客户端,不占用服务端的内存资源
  • JWT默认不加密,但可以加密。生成原始令牌后,可以再次对其进行加密。
  • 当JWT未加密时,一些私密数据无法通过JWT传输。
  • JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
  • JWT本身包含认证信息,token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息,一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。

为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

三、Token实现单点登录(代码)

1.添加JWT依赖与JWT工具类

依赖:

       <!--  jwt依赖    -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

jwt工具类:

public class JwtUtils {
 
    //token过期时间
    public static final long EXPIRE = 1000 * 60 * 60 * 24;
 
    //秘钥,每个公司生成规则不一样
    public static final String APP_SECRET = "rikka六花";
 
    //生成token字符串方法,参数根据自己实际要求指定
    public static String getJwtToken(String id, String nickname) {
        String JwtToken = Jwts.builder()
                //设置jwt头信息,红色部分,内容固定,不需要改
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
 
                .setSubject("guli-user")//设置主题(可选)
                .setIssuedAt(new Date())//设置发布时间(可选)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))//设置过期时间
 
                //设置token主体部分,存储用户信息,可设置多个值
                .claim("id", id)
                .claim("nickname", nickname)
 
                //设置签名哈希(防伪标志)
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
 
        return JwtToken;
    }
 
    /**
     * 判断token是否存在与有效
     *
     * @param jwtToken
     * @return
     */
    public static boolean checkToken(String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) return false;
        try {
            //根据设置的防伪码解析token
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 判断token是否存在与有效
     *
     * @param request
     * @return
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            String jwtToken = request.getHeader("token");
            if (StringUtils.isEmpty(jwtToken)) return false;
            //根据设置的防伪码解析token
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 根据token获取id
     *
     * @param request
     * @return
     */
    public static String getMemberIdByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getHeader("token");
        if (StringUtils.isEmpty(jwtToken)) return "";
        //根据设置的防伪码解析token,获取对象
        Jws<Claims> claimsJws =
                Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        //获取token有效载荷【用户信息】
        Claims claims = claimsJws.getBody();
        return (String) claims.get("id");
    }
 
 
}

2.编写登录方法

    @Override
    public String login(LoginVo loginVo) {
        //写你自己的具体登录逻辑:
        //1.判断参数是否为空
        ...
        //2.判断数据库是否存在该用户
        ...
        //3.判断加密后的密码参数和数据库是否一致
        ...
        //4.判断用户是否禁用
        ...
        //5.生成jwt令牌返回给前端
        return JwtUtils.getJwtToken(ucenterMember.getId(), ucenterMember.getNickname());
    }

 将JWT返回给前端,前端选择将令牌存入cookie或放进地址栏。之后每次都带着JWT发送请求,因为JWT有效载荷里存有id,所以下次后端可根据id查找对应用户信息返回。可根据是否有token判断是否登录,所以单点登录就实现了。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人博客添加访问人数以及访问时间-githubpage

layout: post # 使用的布局&#xff08;不需要改&#xff09; title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…

为什么要建设渲染私有云?

生活中&#xff0c;其实各行各业都离不开渲染技术。建筑行业需要进行场景的渲染&#xff0c;以展示设计方案的效果&#xff1b;工业设计需要进行产品的渲染&#xff0c;以展示产品的外观和设计特点&#xff1b;游戏开发需要进行大量的游戏场景渲染&#xff0c;以测试游戏的视觉…

常见负载均衡算法/策略(概念)

目录 1.1. 轮循均衡&#xff08;Round Robin&#xff09; 1.2. 权重轮循均衡&#xff08;Weighted Round Robin&#xff09; 1.3. 随机均衡&#xff08;Random&#xff09; 1.4. 权重随机均衡&#xff08;Weighted Random&#xff09; 1.5. 响应速度均衡&#xff08;R…

你知道STM32和51单片机的区别吗?

你知道STM32和51单片机的区别吗&#xff1f; 51单片机是很经典的一款单片机。事实上很多电信专业本科阶段都会以这个单片机作为入门。最近很多小伙伴找我&#xff0c;说想要一些STM32的资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心…

数环通让小红书实现对接多应用,小红书如何自动获取售后详情

小红书是年轻人生活方式、社交及电商的平台&#xff0c;包括UGC模式的购物分享社区&#xff0c;以及电商的"福利社"&#xff0c;用户通过线上分享消费体验&#xff0c;引发社区互动&#xff0c;推动其他用户去到线下消费。 数环通将小红书和多应用连接打通&#xff0…

2023第十七届中国品牌节 | 每日互动刘宇分享大模型创新应用AITA智选人群工具

11月18日-20日&#xff0c;2023第十七届中国品牌节在杭州市云栖小镇国际会展中心盛大举行。本次活动以“复苏与腾飞”为主题&#xff0c;来自政、商、产、学、媒等各界嘉宾6000余位济济一堂&#xff0c;共同见证民族品牌的崛起&#xff0c;携手奉献一场史无前例的“品牌人的亚运…

全志R128内存泄漏调试案例

内存泄露调试案例 问题背景 硬件&#xff1a;R128 软件&#xff1a;FreeRTOS rtplayer_test(Cedarx) AudioSystem 问题复现 复现步骤&#xff1a; rtplayer_test /data/boot.mp3串口输入"l", 循环播放串口输入"b" , 播放器后台执行 具体表现 rtpla…

优化资源利用率:kubernetes中装箱的好处与挑战

鉴于 Kubernetes 作为容器编排事实标准的地位&#xff0c;组织不断寻求优化集群资源利用率的方法。其中一种技术是装箱&#xff1a;在集群内有效分配资源&#xff0c;以最大限度地减少运行工作负载所需的节点数量。装箱可以让组织通过减少支持其应用程序所需的节点数量来节省成…

你好,我叫Python,欢迎你认识派森。(来自关于Python语言的全方位自我介绍。

文章目录 自我简介一、Python的发展历程二、Python的特色1.语言特色2.语法特色 三、Python2与Python3的比较1.print 函数2.Unicode3.除法运算4.异常5.八进制字面量表示6.不等运算符7.python 3.0严格使用tab键进行缩进 四、Python适用开发场景及成果1.应用领域2.Python开发出的应…

《Python数据科学项目实战》:开启数据科学之旅的实战指南!

《Python数据科学项目实战》是一本内容丰富且组织结构严谨的书籍&#xff0c;它旨在帮助读者通过实际案例研究掌握使用Python进行数据科学工作的必要知识。本书的案例研究涵盖了在线广告分析、使用新闻数据跟踪疾病暴发等多个现实世界的场景&#xff0c;使读者能够将所学知识应…

【Linux】套接字编程

目录 套接字 IP PORT TCP和UDP的介绍 TCP UDP 网络字节序 转换接口 UDP服务器的编写 服务器的初始化 socket bind sockaddr 结构 服务器的运行 数据的收发 业务处理 客户端的编写 运行效果 拓展 套接字 &#x1f338;首先&#xff0c;我们先思考一个问题…

透视maven打包编译正常,intellj idea编译失败问题的本质

前言 maven多模块类型的项目&#xff0c;在Java的中大型应用中非常常见&#xff0c; 在 module 很多的情况&#xff0c;经常会出现各种各样的编辑依赖错误问题&#xff0c;今天记录一种比较常见的 case &#xff1a; A 子模块依赖 B 子模块&#xff0c;在 Terminal 上终端上 …

地推团队怎么接一手app拉新项目?这几个接单平台可以试试看

首推平台&#xff1a;“聚量推客” 有粉丝问我&#xff1a; 我在五线小城市做地推&#xff0c;有个10人的地推团队&#xff0c;怎么接到一手靠谱的单子&#xff1f; 其实不止一个粉丝在后台问我&#xff0c;做地推、充场的人都在找单子&#xff0c;做这个行业就没有不缺项目的…

二手车选购参考:Honda CB650R/CBR650R 2019~2023 国产价格享进口本田

本田好&#xff0c;本田妙&#xff0c;本田大法呱呱叫。本田的650系列在国内可以说是伤透了一批老车主的心&#xff0c;上路12万&#xff0c;3年现在还值个4万&#xff0c;搁谁也受不了&#xff0c;正好没什么太好的新闻写&#xff0c;今天就带大家来看看二手车选购参考&#x…

MQ和redis的内部原理一些总结

首先&#xff0c;先知道内部原理&#xff1b;其次&#xff0c;就是查官方文档实战了。 但是如果不熟悉内部原理&#xff0c;那么仅仅只是安装官方文档&#xff0c;并不能排除跟踪问题和故障、预防风险等策略&#xff1b; 以下总结图解&#xff1a;&#xff08;mysql 8.0新增的…

6个国内外高质量icon素材网站分享给你,实用不花钱!

相信同是作为一名设计师&#xff0c;我们在看到一些好看的、有创意的或者是有设计感的素材时都会忍不住想保存下来&#xff0c;以防在我们做设计时没有灵感&#xff0c;开始抓瞎做设计&#xff0c;怎么也想不出来什么好的创意。可想而知&#xff0c;那样的情况下做出来的设计也…

stable-diffusion-webui之webui.py

主要就是webui的启动这块&#xff0c;需要初始化的地方&#xff0c;东西还是挺多的。

软件项目测试指南

软件测试是保证软件产品质量的重要手段之一。它是测量、评估软件产品特点和能力的活动。现在&#xff0c;国内一些软件企业对于软件测试的重视程度还很不够&#xff0c;认为测试工作非常简单&#xff0c;只是简单地操作所测的软件产品而已。这种错误的思想严重影响了国内软件质…

NX二次开发UF_CAM_ask_f_s_db_object 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_f_s_db_object Defined in: uf_cam.h int UF_CAM_ask_f_s_db_object(UF_CAM_db_object_t * db_obj ) overview 概述 This function provides the database object which is currently u…

virtuoso 后仿 ADE L error

ADE后仿时出现error ERROR (SFE-23): "input.scs" 299: The instance _57_D32_noxref is referencing an undefined model or subcircuit, parasitic_nwd. Either include the file containing the definition of parasitic_nwd, or define parasitic_nwd before run…