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

1、用户发起登录请求。

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

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

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

流程图如下:

一、用户发起登录请求

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

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

@Authorization

@ResponseBody

@GetMapping("user/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("对不起,您的请求非法,系统拒绝响应!");

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());

}

五、总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-08-02

接口使用jwt返回token_Java中使用JWT生成Token进行接口鉴权实现方法相关推荐

  1. java 接口 token_Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...

  2. java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...

  3. tp5 JWT生成token验证接口安全、防止高频请求

    1.composer安装 jwt composer require lcobucci/jwt 3.3 2.在extend/tools/jwt目录下创建Token.php文件 注意 extend目录下t ...

  4. JAVA接口的访问权限_Java中访问权限-类和接口

    (1)类和接口的访问权限种类一样 , 有两中public,default,它们的不同在于是否能访问不同包中的类或接口 default:只能在本包中访问 public:任何地方都可以访问,当然不同的包中 ...

  5. android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...

    ---coding by yuangu(lifulinghan@aol.com) --用于计算2个pgs之间的距离 function computeDistance(lat1, lon1, lat2, ...

  6. JWT登录过期自动刷新方案与token泄漏解决方案

    概念 简单来说JWT就是通过一定规范来生成token,再用解密算法解密token,就可以获取用户信息了. 优缺点 优点:避免重复查库,存储在客户端,不占用服务端资源 缺点:token是经过base64 ...

  7. 用户鉴权、JWT(JSON Web Token)是什么?

    什么是用户鉴权 用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法.用于用户登陆到DSMP或使用数据业务时,业务网关或Portal发送此消息到DSMP,对该用户使用数据业 ...

  8. python选择题题目_Python接口测试题(持续更新中)

    1.json和字典的区别? Json是轻量级的数据交互格式,以key-value的键值对形式来保存数据,结构清晰,可以说是目前互联网项目开发中最常用的一种数据交互格式. 字典,同样是以key-valu ...

  9. python中接口测试垃圾数据如何清理_Python接口测试题(持续更新中)

    1.json和字典的区别? Json是轻量级的数据交互格式,以key-value的键值对形式来保存数据,结构清晰,可以说是目前互联网项目开发中最常用的一种数据交互格式. 字典,同样是以key-valu ...

最新文章

  1. 关于win2003服务器远程断开后自动注销的问题解决
  2. 怎样查找html概念,HTML一般概念_html
  3. Oracle/PLSQL While Loop
  4. Linux-进程管理
  5. Bailian2738 实数加法【数学】
  6. 洛谷 P1573 栈的操作
  7. 开发环境搭建与Hadoop的配置
  8. 2016年国家公务员考试公告
  9. 启动vpn报网络扩展错误(问题篇)
  10. mysql jemalloc_安装 jemalloc for mysql
  11. 树莓派python 简介_自己动手实现智能家居之树莓派GPIO简介(Python版)
  12. h5页面中android与ios返回上一级并强制刷新的方式
  13. 关于研发项目计划排期与项目需求延期的想法
  14. 石油远程《机械设计》第一次在线作业
  15. 浏览器暗黑模式-Dark深色模式
  16. 量子计算机的运用原理,量子计算机的工作原理和运用?
  17. 基于gpg的fwknop配置流程
  18. z-index使用以及失效的处理方法
  19. C++打造植物大战僵尸辅助!附完整项目源码
  20. 基于STM32的智能健康监测手环

热门文章

  1. python 读取txt文件没读到400行_400行Python代码实现文语处理助手(3) - 音频显示-嵌入式系统-与非网...
  2. IDEA中terminal中执行git log中文乱码
  3. mongodb比较操作符笔记
  4. 2015计算机类专业课类试卷,2015年自考《计算机应用基础》模拟试题及答案
  5. linux chattr修改文件属性,linux chattr(改变文件属性)
  6. java两个日期之间所有日期_java如何输出指定两个日期之间的所有日期
  7. 在JSP页面中,对同名的CHECKBOX的处理
  8. Struts 体系结构与工作原理 图
  9. jinfo命令 Java Configuration Info
  10. 运行报错Error starting ApplicationContext