广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot集成Auth0 JWT的示例代码
  • 794
分享到

SpringBoot集成Auth0 JWT的示例代码

2024-04-02 19:04:59 794人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言session认证与Token认证session认证Token认证Jwt简介JWT定义JWT的类库具体实现JWT配置JWT工具类测试接口前言 说说JWT,先说下互联网服务常见

前言

说说JWT,先说下互联网服务常见的两种用户认证方式:

session认证与Token认证

session认证

传统的Session认证的大体流程可以表示为用户提供用户名和密码登录后由服务器存储一份用户登录信息并传递给浏览器保存为Cookie,并在下次请求中根据Cookie来识别用户,但这种方式缺陷明显:

  • Session都是保存在内存中,随着认证用户的增多,服务端的开销明显增大
  • 保存在内存中的Session限制了分布式的应用
  • Cookie容易被截获伪造

Token认证

Token 泛指身份验证时使用的令牌,Token鉴权机制从某些角度而言与Cookie是一个作用,其目的是让后台知道请求是来自于受信的客户端,其通过实现了某种算法加密的Token字符串来完成鉴权工作,其优点在于:

  • 服务器不需要保存 Session 数据(无状态),容易实现扩展
  • 有效避免Cookie被截获引发的CSRF攻击
  • 可以存储一些业务逻辑所必要的非敏感信息
  • 便于传输,其构成非常简单,字节占用小

JWT简介

JWT定义

JWT全称为JSON WEB token,也就是 json 格式的 web token,可以这么理解:

Token // 个人证件
JWT // 个人身份证

JWT数据结构

JWT由三段字符串组成,中间用.分隔,如下:

eyJ0eXaiOiJKV1QiLCJhbGCiOiJIUzI1NiJ9.eyJ1aWQiOjEsInNjb3BlIjo4LCJleHAiOjE3MTU3NDAyMjIsImlhdCI6MTYyOTM0MDIyMn0.wuRsF5wvLHbDF_21Pocas8SeXQ315rgBl6wm1LRL2bQ

JWT 的三个部分依次如下:

  • Header(头部)// Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
  • Payload(负载)// Payload 部分是一个 JSON 对象,用来存放实际需要传递的数据
  • Signature(签名)// Signature 部分是对前两部分的签名,防止数据篡改

第一段字符串Header:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9将其 Base64 解码后得到:


{
	"typ": "JWT", // TOKEN TYPE ,token类型
	"alg": "HS256"  //ALGoRITHM,算法 哈希256
}

第二段字符串Payload:eyJ1aWQiOjEsInNjb3BlIjo4LCJleHAiOjE3MTU3NDAyMjIsImlhdCI6MTYyOTM0MDIyMn0

PAYLOAD是数据载体,可以有自定义数据


{
"uid": "1234567890" // 自定义数据
}

第三段字符串Signature:wuRsF5wvLHbDF_21Pocas8SeXQ315rgBl6wm1LRL2bQ

Signature 部分是对前两部分的签名,防止数据篡改。

JWT的类库

Java 中的 JWT 有很多类库,关于其优缺点可以在官网查看:https://jwt.io/,这里我们介绍Auth0的JWT的集成使用方式

Auth0 实现的 com.auth0 / java-jwt / 3.3.0
Brian Campbell 实现的 org.bitbucket.b_c / jose4j / 0.6.3
connect2id 实现的 com.nimbusds / nimbus-jose-jwt / 5.7
Les Hazlewood 实现的 io.jsonwebtoken / jjwt / 0.9.0
FusionAuth 实现的 io.fusionauth / fusionauth-jwt / 3.1.0
Vert.x 实现的 io.vertx / vertx-auth-jwt / 3.5.1

具体实现

JWT配置

pom.xml


<!-- jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.8.1</version>
</dependency>

application.yml


coisini:
  security:
    jwt-key: coisini
    # 过期时间
    token-expired-in: 86400000

JWT工具类

JwtUtil.java


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.*;


@Component
public class JwtUtil {

    
    private static String jwTKEy;

    
    private static Integer expiredTimeIn;

    
    @Value("${coisini.security.jwt-key}")
    public void setJwtKey(String jwtKey) {
        JwtUtil.jwtKey = jwtKey;
    }

    
    @Value("${coisini.security.token-expired-in}")
    public void setExpiredTimeIn(Integer expiredTimeIn) {
        JwtUtil.expiredTimeIn = expiredTimeIn;
    }

    
    public static String makeToken(Long uid) {
        return JwtUtil.getToken(uid);
    }

    
    private static String getToken(Long uid) {
        // 指定算法
        Algorithm algorithm = Algorithm.HMac256(JwtUtil.jwtKey);

        Map<String, Date> dateMap = JwtUtil.calculateExpiRedissues();

        
        return JWT.create()
                    .withClaim("uid", uid)
                    .withExpiresAt(dateMap.get("expiredTime"))
                    .withIssuedAt(dateMap.get("now"))
                    .sign(algorithm);
    }

    
    public static Optional<Map<String, Claim>> getClaims(String token) {
        DecodedJWT decodedJWT;

        // 指定算法
        Algorithm algorithm = Algorithm.HMAC256(JwtUtil.jwtKey);
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();

        try {
            decodedJWT = jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            return Optional.empty();
        }

        return Optional.of(decodedJWT.getClaims());
    }

    
    public static boolean verifyToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(JwtUtil.jwtKey);
            JWTVerifier jwtVerifier = JWT.require(algorithm).build();
            jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            return false;
        }

        return true;
    }

    
    private static Map<String, Date> calculateExpiredIssues() {
        Map<String, Date> map = new HashMap<>();
        Calendar calendar = Calendar.getInstance();
        Date now = calendar.getTime();
        calendar.add(Calendar.SECOND, JwtUtil.expiredTimeIn);
        // 当前时间
        map.put("now", now);
        // 过期时间
        map.put("expiredTime", calendar.getTime());
        return map;
    }
}

测试接口

JwtController.java


@RestController
@RequestMapping("/jwt")
public class JwtController {

    
    @GetMapping(value = "/get")
    public String getToken(@RequestParam Long id) {
        return JwtUtil.makeToken(id);
    }

    
    @PostMapping("/verify")
    public Map<String, Boolean> verify(@RequestParam String token) {
        Map<String, Boolean> map = new HashMap<>();
        Boolean valid = JwtUtil.verifyToken(token);
        map.put("is_valid", valid);
        return map;
    }

}

测试结果

JWT生成的Token应该放在请求头内来传输,后端统一拦截验证,这里留在下篇文章吧。。。

到此这篇关于SpringBoot集成Auth0 JWT的示例代码的文章就介绍到这了,更多相关SpringBoot集成Auth0 JWT内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot集成Auth0 JWT的示例代码

本文链接: https://www.lsjlt.com/news/133106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot集成Auth0 JWT的示例代码
    目录前言session认证与Token认证session认证Token认证JWT简介JWT定义JWT的类库具体实现JWT配置JWT工具类测试接口前言 说说JWT,先说下互联网服务常见...
    99+
    2022-11-12
  • SpringBoot集成redis的示例代码
    目录前言一、redis是什么二、集成redis步骤三、代码演示前言 redis想必小伙伴们即使没有用过,也是经常听到的,在工作中,redis用到的频率非常高,今天详细介绍一下Spr...
    99+
    2022-11-12
  • SpringBoot集成ElasticSearch的示例代码
    目录一、Elasticseach介绍1.简单介绍2.对比关系:3.详细说明:4.查出数据的解释 二、SpringBoot集成Elasticseach1.引入依赖2.添加配置...
    99+
    2022-11-13
  • Springboot WebFlux集成Spring Security实现JWT认证的示例
    目录1 简介 2 项目整合 2.1 JWT工具类 2.2 JWT的过滤器 2.3 Security的配置 2.4 获取JWT的Controller 3 总结 1 简介 在之前的文章...
    99+
    2022-11-12
  • Spring Boot 集成JWT实现前后端认证的示例代码
    目录前言JWT简介为什么要用JWT传统session认证存在那些弊端?JWT认证的优势JWT的数据结构HeaderPayloadSignatureSpring Boot集成JWT引入...
    99+
    2022-11-13
  • 基于Springboot实现JWT认证的示例代码
    目录一、了解JWT概念作用1.1 为什么授权要使用jwt二、JWT结构2.1 header2.2 payload2.3 signature三、使用JWT3.1 上手3.2 封装工具类...
    99+
    2022-11-12
  • SpringBoot集成Druid的实例代码
    快速开始 依赖 <dependency> <groupId>com.alibaba</groupId> ...
    99+
    2022-11-12
  • springboot集成微软teams的实例代码
    前言 最近做了一个有关微软的平台teams开发,在国内用微软teams聊天工具的少之又少,整个亚洲也没什么开发的实例,官方文档写的有点乱,在没有第三方支持下开发有点头疼。需求是做一个...
    99+
    2022-11-13
  • nodejs实现jwt的示例代码
    目录1.为什么需要会话管理2.session和cookies3.jwt的定义4.jwt的原理5.jwt的认证流程6.jwt的数据结构7.jwt使用方式8.在koa项目中使用9.原理的...
    99+
    2023-03-03
    node实现jwt node jwt
  • Springboot2.x集成kafka2.2.0的示例代码
    目录引言基本环境代码编写1、基本引用pom2、基本配置3、实体类4、生产者端5、消费者6、测试效果展示遇到的问题引言 kafka近几年更新非常快,也可以看出kafka在企业中是用的频...
    99+
    2022-11-13
  • SpringBoot2.x集成Dozer的示例代码
    目录一、引入依赖二、实体类三、编写配置文件四、创建测试类五、Dozer的基本使用代码示例Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制...
    99+
    2022-11-12
  • Springboot整合Dubbo之代码集成和发布的示例分析
    这篇文章主要介绍了Springboot整合Dubbo之代码集成和发布的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1. boot-dubbo-api相关打...
    99+
    2023-05-30
    springboot dubbo
  • springMarchal集成xStream的完整示例代码
    Xstream是一个库, 用于将对象序列化为xml, 反之亦然, 而无需任何映射文件。注意, castor需要一个映射文件。 XStreamMarshaller类提供了将对象封送为x...
    99+
    2022-11-13
  • SpringBoot集成redis的示例分析
    这篇文章给大家分享的是有关SpringBoot集成redis的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何使用springBoot集成redis 定义REmote ...
    99+
    2022-10-18
  • springboot集成camunda的实现示例
    目录1、说明2、配置实战3、生成数据库表说明1、说明 camunda使用Java开的工作流引擎。这里使用springboot 2.2.6.release + camunda 3.4...
    99+
    2022-11-12
  • SpringBoot集成drools的实现示例
    目录1、背景2、需求3、实现3.1 引入jar包3.2 编写drools配置类3.3 编写Person对象3.4 编写drl文件3.5 编写kmodule.xml文件3.6 编写Co...
    99+
    2022-11-13
  • golang原生实现JWT的示例代码
    目录获取Token解析Token实际使用测试结果结语JWT(JSON Web Token)是一种基于JSON的安全令牌,可以用于在不同系统之间传输认证信息。在Go中实现JWT验证,可...
    99+
    2023-05-19
    golang实现JWT golang JWT
  • 在Java中使用Jwt的示例代码
    目录JWT 特点 1. JWT 的原理 2. JWT 的数据结构 2.1 Header 2.2 Payload 2.3 Signature 3. 在 Java 中使用 JWT 特点 ...
    99+
    2022-11-12
  • SpringBoot集成Mybatis-plus并实现自动生成相关文件的示例代码
    Mybatis-Plus是一个优秀的Mybatis增强工具,目前更新到3.1.1。Mybatis-Plus原生提供了很多单表操作的方法,极大简化了繁琐的curd的操作,同时又支持xm...
    99+
    2022-11-12
  • SpringBoot集成MyBatis的分页插件PageHelper实例代码
    昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心得和源码,主要就算是敲了一下SpringBoot的门儿,希望能给各位的入门带给一点儿捷径,今天给各位温习一下MyBatis的分页插件PageHelper和Sp...
    99+
    2023-05-31
    springboot mybatis pagehelper
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作