Java中使用JWT生成Token进行接口鉴权实现

zhoudatong 2018-12-01 原文

Java中使用JWT生成Token进行接口鉴权实现

先介绍下利用JWT进行鉴权的思路:

1、用户发起登录请求。

2、服务端创建一个加密后的JWT信息,作为Token返回。

3、在后续请求中JWT信息作为请求头,发给服务端。

4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

流程图如下:

网图

一、用户发起登录请求

欢迎大家访问www.fota.com

二、服务端创建一个加密后的JWT信息,作为Token返回

1、用户登录之后把生成的Token返回给前端

@Authorization
@ResponseBody
@GetMapping("user/info/auth")
public Result getUserSecurityInfo(HttpServletRequest request) {
   try {
       UserDTO userDTO = ...
       UserVO userVO = new UserVO();
       //这里调用创建JWT信息的方法
       userVO.setToken(TokenUtil.createJWT(String.valueOf(userDTO.getId())));
       return Result.success(userVO);
   } catch (Exception e) {
       return Result.fail(ErrorEnum.SYSTEM_ERROR);
   }
}

2、创建JWT,Generate Tokens

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import io.jsonwebtoken.*;
import java.util.Date;    
 
//Sample method to construct a JWT
private String createJWT(String id, String issuer, String subject, long ttlMillis) {
 
    //The JWT signature algorithm we will be using to sign the token
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
 
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);
 
    //We will sign our JWT with our ApiKey secret
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
 
    //Let's set the JWT Claims
    JwtBuilder builder = Jwts.builder().setId(id)
                                .setIssuedAt(now)
                                .setSubject(subject)
                                .setIssuer(issuer)
                                .signWith(signatureAlgorithm, signingKey);
 
    //if it has been specified, let's add the expiration
    if (ttlMillis >= 0) {
    long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
    }
 
    //Builds the JWT and serializes it to a compact, URL-safe string
    return builder.compact();
}

3、作为Token返回

看后面有个Token

三、在后续请求中JWT信息作为请求头,发给服务端

缺一个图,马上补

四、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

1、在拦截器中读取这个Header里面的Token值

@Slf4j
@Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
    private boolean chechToken(HttpServletRequest request, HttpServletResponse response) throws IOException{
        Long userId = ...;

        if (!TokenUtil.parseJWT(request.getHeader("Authorization"), String.valueOf(userId))){
            response.setContentType("text/html;charset=GBK");
            response.setCharacterEncoding("GBK");
            response.setStatus(403);
            response.getWriter().print("<font size=6 color=red>对不起,您的请求非法,系统拒绝响应!</font>");
            return false;
        } else{
            return true;
        }
    }
}

2、拿到之后进行解密校验

Decode and Verify Tokens

import javax.xml.bind.DatatypeConverter;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;
 
//Sample method to validate and read the JWT
private void parseJWT(String jwt) {
    //This line will throw an exception if it is not a signed JWS (as expected)
    Claims claims = Jwts.parser()         
       .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
       .parseClaimsJws(jwt).getBody();
    System.out.println("ID: " + claims.getId());
    System.out.println("Subject: " + claims.getSubject());
    System.out.println("Issuer: " + claims.getIssuer());
    System.out.println("Expiration: " + claims.getExpiration());
}

五、总结

大家知道,我之前做过爬虫,实际这种思路在微博做反爬时也用过,做过我之前文章的同学应该知道。

发表于 2018-12-01 21:05 神一样的编程 阅读() 评论() 编辑 收藏

 

版权声明:本文为zhoudatong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhoudatong/p/10051020.html

Java中使用JWT生成Token进行接口鉴权实现的更多相关文章

  1. 握草,这些研发事故30%我都干过!

    作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!...

  2. 云开发是啥?看看它在编程导航项目的实践

    大家好,我是鱼皮,近几年腾讯云开发技术持续发力,更新升级速度非常迅猛,功能也是越来越强大易用,公司最近也搞了场 […]...

  3. JAVA 及 Eclipse 历史简介…[转帖] – COM.ZHJ

    JAVA 及 Eclipse 历史简介…[转帖] 1998年java EE技术有Sun公司发布,2 […]...

  4. Java 面试-即时编译( JIT )

    当我们在写代码时,一个方法内部的行数自然是越少越好,这样逻辑清晰、方便阅读,其实好处远不止如此,通过即时编译, […]...

  5. Java 8原生API也可以开发响应式代码?

    前段时间工作上比较忙,这篇文章一直没来得及写,本文是阅读《Java8实战》的时候,了解到Java 8里已经提供 […]...

  6. Java 开发简单的贪吃蛇游戏 – 珍惜眼前人

    Java 开发简单的贪吃蛇游戏 public class Test { public static void […]...

  7. 《深入理解 Java 虚拟机》读书笔记:类文件结构

    正文 一、无关性的基石 1、两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,“一次编写,到 […]...

  8. Lucene入门程序-Java API的简单使用

    Lucene入门程序 准备环境 JDK: 1.8.0_162 IDE: Eclipse Neon.3 数据库: […]...

随机推荐

  1. 如何实现一个 System Services?

    《Android 系统开发做什么?》写到 Android System Services 是专注于特定功能的模 […]...

  2. matlab怎么查看已安装哪些工具箱和…

    matlab怎么查看已安装哪些工具箱和… 问题描述:matlab怎么查看已安装哪些工具箱和它们相应的版本 解决 […]...

  3. 容器list使用之erase(其他容器也通用)

    今天无论如何要写点东西,算是搞清楚了一点东西吧。有点小小的成就感。 之前在程序里面使用了list容器,其中用到 […]...

  4. IP地址进制转换

    IP地址进制转换 #!/usr/bin/env python # -*- coding:utf-8 -*- " […]...

  5. java EE学习流程(第二版更新)

    这周有点堕落了,这两天啥都没写,就顾上刷《庆余年》了...

  6. EXCEL 中找出两个sheet相同列

    在工作中我们可能经常会使用到,在sheet1-》A 列数据同时在sheet2->A列出现。那么我们用EX […]...

  7. Shell编程-02-Shell变量

    什么是Shell变量     在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右 […]...

  8. 算法基础(一)

    认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是 固定时间内完成的操作,叫做常数操作。时间 […]...

展开目录

目录导航