博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring安全验证之jwt(json web token)实践
阅读量:7023 次
发布时间:2019-06-28

本文共 2637 字,大约阅读时间需要 8 分钟。

hot3.png

spring安全验证之jwt(json web token)实践 博客分类: spring java
系统开发来讲,安全验证永远是最重要的,从最原始的session、cookie验证方式,到符合restful风格、满足前后端分离需求、启用https请求,各方面都在不断变化中。本文以jwt(json web token)的实践为例,介绍一二。首先,来看一下jwt的概念,流程图如下所示:流程图用户发起登录请求,服务端创建一个加密后的jwt信息,作为token返回值,在后续请求中jwt信息作为请求头,服务端正确解密后可获取到存储的用户信息,表示验证通过;解密失败说明token无效或者已过期。加密后jwt信息如下所示,是由.分割的三部分组成,分别为Header、Payload、Signature。eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3QiLCJpYXQiOjE0NzEyNzYyNTEsInN1YiI6IntcInVzZXJJZFwiOjEsXCJyb2xlSWRcIjoxfSIsImV4cCI6MTQ3MTMxOTQ1MX0.vW-pPSl5bU4dmORMa7UzPjBR0F6sqg3n3hQuKY8j35o12Header包含两部分信息,alg指加密类型,可选值为HS256、RSA等等,typ=JWT为固定值,表示token的类型。{    "alg": "HS256",    "typ": "JWT"}12345Payload是指签名信息以及内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网。{    "sub": "1234567890",    "name": "John Doe",    "admin": true}123456Signature则为对Header、Payload的签名。HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)12在jwt官网,可以看到有不同语言的实现版本,这里使用的是java版的jjwt。话不多说,直接看代码,加解密都很简单:/**  * 创建 jwt  * @param id  * @param subject  * @param ttlMillis  * @return  * @throws Exception  */  public String createJWT(String id, String subject, long ttlMillis) throws Exception {       SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256 ;       long nowMillis = System. currentTimeMillis();       Date now = new Date( nowMillis);       SecretKey key = generalKey();       JwtBuilder builder = Jwts. builder()            .setId(id)            .setIssuedAt(now)            .setSubject(subject)           .signWith(signatureAlgorithm, key);       if (ttlMillis >= 0){           long expMillis = nowMillis + ttlMillis;           Date exp = new Date( expMillis);           builder.setExpiration( exp);       }       return builder.compact(); }  /**  * 解密 jwt  * @param jwt  * @return  * @throws Exception  */  public Claims parseJWT(String jwt) throws Exception{       SecretKey key = generalKey();       Claims claims = Jwts. parser()          .setSigningKey( key)          .parseClaimsJws( jwt).getBody();       return claims; }12345678910111213141516171819202122232425262728293031323334353637383940加解密的key是通过固定字符串转换而生成的;subject为用户信息的json字符串;ttlMillis是指token的有效期,时间较短,需要定时更新。这里要介绍的token刷新方式,是在生成token的同时生成一个有效期较长的refreshToken,后续由客户端定时根据refreshToken来获取最新的token。浏览器与服务端之间建立sse(server send event)请求,来实现刷新。关于sse在前面博文中有介绍过,此处略过不提。本文完整源代码存放于github,地址:https://github.com/ahmu/spring-authorization-demo。参考资料:1.jwt官方网站:https://jwt.io/2.jjwt项目:https://github.com/jwtk/jjwt3.Introduction to JSON Web Tokens:https://jwt.io/introduction/4.How to Create and verify JWTs in Java: https://stormpath.com/blog/jwt-java-create-verify

 

转载于:https://my.oschina.net/xiaominmin/blog/1598886

你可能感兴趣的文章
[Hibernate] - one to one
查看>>
【安卓】eclipse中不可错过的几个秘密、!
查看>>
桥接模式
查看>>
设置导航栏标题的文字属性
查看>>
纯银:优秀的人才,没一个开口就问“贵司薪水几何”(转)
查看>>
LoadTestAgentResultsLateException in VS2010
查看>>
开源一个基于nio的java网络程序
查看>>
在Hibernate中使用HibernateTemplate来进行包含sql语句的查询
查看>>
sqlite3经常使用命令&语法
查看>>
Java Collection 简介
查看>>
一个非常不错的背景纹理图的网站
查看>>
WinStore之Application Data
查看>>
word 批量修改表格格式
查看>>
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
查看>>
memcpy内存拷贝及优化策略图解
查看>>
SQL Server 数据的创建、增长、收缩
查看>>
合并数据
查看>>
RAM,ROM,NAND Flash,NOR Flash(A)
查看>>
安卓启动相关以及架构设计相关
查看>>
centos中添加php扩展pdo_mysql步骤
查看>>