JWT简单使用

JWT 资料

JSON Web Token 入门教程

JWT 也不是万能的呀,入坑需谨慎!

JWT 简单使用

环境:SpringBoot + JWT

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ray</groupId>
    <artifactId>springboot-jwt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-jwt</name>
    <description>Spring Boot 整合 JWT</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入jwt-->
        <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.11.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

yml

## jwt 相关配置
jwt:
  secret: token!Q@W#E$R%GF*DS&VC$$JKJS@@ZXC!DR

controller

package com.ray.springbootjwt.controller;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.*;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Calendar;

/**
 * @Description: JWT 测试接口
 * @Author Ray
 * @Date 2020/10/20 15:46
 * @Version 1.0
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {

    @Value("${jwt.secret}")
    private String secret;

    /**
     * 生成token
     */
    @RequestMapping(value = "/createToken")
    public String createToken() {
        JWTCreator.Builder builder = JWT.create();

        // 载体,携带的内容
        builder.withClaim("id", "1")
                .withClaim("username", "Ray");

        // 过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, 30);

        // 指定令牌的过期时间
        builder.withExpiresAt(instance.getTime());

        // 签名,并生成token
        String token = builder.sign(Algorithm.HMAC256(secret));

        return token;
    }

    /**
     * 验证token
     */
    @RequestMapping(value = "/verifyToken")
    public String verifyToken(String token) {

        // 需要匹配相同的加密
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();

        try {
            // 验证的时候,会抛出各种异常
            DecodedJWT verify = jwtVerifier.verify(token);

            // 假设验证通过,获取里面的信息
            String id = verify.getClaim("id").asString();
            String username = verify.getClaim("username").asString();

            return "id: " + id + "\t   username: " + username;

        } catch (SignatureVerificationException e) {
            e.printStackTrace();
            return "error ~~ 签名不一致";
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            return "error ~~ 令牌过期";
        } catch (AlgorithmMismatchException e) {
            e.printStackTrace();
            return "error ~~ 算法不匹配";
        } catch (InvalidClaimException e) {
            e.printStackTrace();
            return "error ~~ 失效的payload";
        } catch (Exception e) {
            e.printStackTrace();
            return "error ~~ token无效";
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 06OpenFeign服务接口调用

    http://localhost/consumer/payment/get/130

    Remember_Ray
  • 01基础项目工程搭建

    http://localhost:8001/payment/save?serial=ray123

    Remember_Ray
  • 03Zookeeper服务注册与发现

    wget https://mirrors.estointernet.in/apache/zookeeper/zookeeper-3.6.2/apache-zoo...

    Remember_Ray
  • Java | 第一个 SpringBoot 工程详解

    前文已经说过了 SpringBoot 工程的创建,这里不再赘述,还不会的朋友,请看下面这篇文章。

    一个优秀的废人
  • Springboot热部署,使用spring-boot-devtools、springloaded两种方式进行热部署

    1、在项目的开发阶段,经常需要对代码进行反复修改,这样就会导致SpringBoot运行容器反复启动。为了解决这种频繁重启问题,SpringBoot提供了自动加载...

    别先生
  • 让我们让SpringBoot应用程序更快启动

    使用SpringInitializr创建了一个只有Reactive Web的项目。然后,我写了一个WebMVC风格的小控制器。

    lyb-geek
  • Spring Security 实战 - Spring Security OAuth2项目准备

    公众号-JavaEdge
  • MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB

    Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作。Spring Boot的目的是提供一组工具,以便快速构建容易配...

    Jerry Wang
  • Spring Boot 之 在IDEA中的热部署

    白墨石
  • Hystrix-dashboard 豪猪

    用户5927264

扫码关注云+社区

领取腾讯云代金券