java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现
先介绍下利用JWT进行鉴权的思路:
1、用户发起登录请求。
2、服务端创建一个加密后的JWT信息,作为Token返回。
3、在后续请求中JWT信息作为请求头,发给服务端。
4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。
流程图如下:
网图
一、用户发起登录请求
欢迎大家访问www.fota.com
二、服务端创建一个加密后的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信息作为请求头,发给服务端
Authorization的值。
image.png
四、服务端拿到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());
}
五、总结
大家知道,我之前做过爬虫,实际这种思路在微博做反爬时也用过,看过我之前文章的同学应该知道。
好了,最后欢迎大家访问www.fota.com体验我们的产品。
java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现相关推荐
- java 接口 token_Java中使用JWT生成Token进行接口鉴权实现方法
先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...
- 接口使用jwt返回token_Java中使用JWT生成Token进行接口鉴权实现方法
先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...
- tp5 JWT生成token验证接口安全、防止高频请求
1.composer安装 jwt composer require lcobucci/jwt 3.3 2.在extend/tools/jwt目录下创建Token.php文件 注意 extend目录下t ...
- java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at
[http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- 【SpringBoot】44、SpringBoot中整合JWT实现Token验证(整合篇)
什么是JWT? Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519),该 token 被设计为紧凑且安全的,特别适用于分 ...
- JAVA中为什么要用接口定义编程_【Java公开课|为什么要用Java接口,这些内容你一定要搞清楚】- 环球网校...
[摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...
- java类接口的区别_【Java基础】java接口和类的区别-瑶瑶吖的回答
基本语法区别 Java中接口和抽象类的定义语法分别为interface与abstract关键字. 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为 ...
- java 是否含有日文_《JAVA编程思想》5分钟速成:第9章(接口)
第9章 接口 前言: 1.抽象类(abstract class)和接口(interface)有什么异同? 2.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(n ...
最新文章
- 强势 图解 AC自动机(保证您一次就能学会!)
- 100本名著浓缩成了100句话
- python程序中断时,输出打印日志
- 内置函数(面向对象)
- noip2011day1题解
- [蓝桥杯][2019年第十届真题]糖果(状压dp)
- 跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义
- xms跨平台基础框架 - 基于.netcore
- PhpYun人才系统 与 Discuz 社区 通过 Ucenter 做会员整合
- php调用apache,apache调用php执行系统命令
- super-smack
- java进账和转账需要锁吗,Spring与Java中的锁
- 如何使用Internet Download Manager批量下载音乐素材?
- 设计用于环境监测的无线传感网多跳数据采集、传输系统。在PC机上能显示当前测得的温/湿度、光照等环境信息。当光照超过一定阈值时,感知节点通过LED信号灯给以报警。
- 【机器学习】数据驱动方法在电网稳定分析应用浅谈
- [LiteratureReview]EAO-SLAM Monocular Semi-Dense Object SLAM Based on Ensemble Data Association
- 导进去然后这边就报错了 看修改也看不懂
- 一键安装Lnmp教程
- 京东技术解密读书笔记
- go语言学习第一弹:go和php的区别
热门文章
- 欧洲杯决赛倒计时,球迷经济带火了哪些产品?
- c++ 包络谱分析代码_信号处理——Hilbert变换及谱分析
- [ExtJS5学习笔记]第二十八节 sencha ext js 5.1.0发布版本正式发布 extjs doc下载地址
- 中值联:首个区块链诚信认证平台成立
- 我的 博客 主页
- mysql安装5.1.57_数据库mysql57安装
- php随机名人名言,php随机输出名人名言的代码
- QT学习:字体对话框
- 老子云3D产品及服务全介绍,一张图告诉你如何选!
- mybatis源码考究二(sqlsession线程安全和缓存失效)