微网站建设制作设计,什么是关键词推广,佛山企业网站seo,鸿蒙系统应用软件开发安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态#xff1f;1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类1.无状态登录原理
有状态登录和无状态登录详…
安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类1.无状态登录原理
有状态登录和无状态登录详解
1.1.什么是有状态
有状态服务即服务端需要记录每次会话的客户端信息从而识别客户端身份根据用户身份进行请求的处理典型的设计如tomcat中的session。
例如登录用户登录后我们把登录者的信息保存在服务端session中并且给用户一个cookie值记录对应的session。然后下次请求用户携带cookie值来我们就能识别到对应session从而找到用户的信息。
缺点是什么
服务端保存大量数据增加服务端压力服务端保存用户状态无法进行水平扩展客户端请求依赖服务端多次请求必须访问同一台服务器
1.2.什么是无状态
微服务集群中的每个服务对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是服务的无状态性即
服务端不保存任何客户端请求者信息客户端的每次请求必须具备自描述信息通过这些信息识别客户端身份
带来的好处是什么呢
客户端请求不依赖服务端的信息任何多次请求不需要必须访问到同一台服务服务端的集群和状态对客户端透明服务端可以任意的迁移和伸缩减小服务端存储压力
1.3.如何实现无状态
无状态登录的流程
当客户端第一次请求服务时服务端对用户进行信息认证登录认证通过将用户信息进行加密形成token返回给客户端作为登录凭证以后每次请求客户端都携带认证的token服务端对token进行解密判断是否有效。
整个登录过程中最关键的点是什么
token的安全性
token是识别客户端身份的唯一标示如果加密不够严密被人伪造那就完蛋了。
采用何种方式加密才是安全可靠的呢
我们将采用JWT来生成token保证token的安全性
1.4.JWT
1.4.1.简介
JWT全称是Json Web Token 是JSON风格轻量级的授权和身份认证规范可实现无状态、分布式的Web应用授权官网https://jwt.io GitHub上jwt的java客户端https://github.com/jwtk/jjwt
1.4.2.数据格式
JWT包含三部分数据 Header头部通常头部有两部分信息 token类型这里是JWT签名算法自定义 我们会对头部进行base64加密可解密得到第一部分数据 Payload载荷就是有效数据一般包含下面信息 标准载荷JWT规定的信息jwt的元数据 JTI: JWT的id当前jwt的唯一标识像身份证号IAT: issue at 签发时间EXP过期时间SUB签发人… 自定义载荷 用户身份信息注意这里因为采用base64加密可解密因此不要存放敏感信息 这部分也会采用base64加密得到第二部分数据 Signature签名是整个数据的认证信息。一般根据前两步的数据再加上服务的的密钥secret不要泄漏最好周期性更换通过加密算法生成。用于验证整个数据完整和可靠性
生成的数据格式 可以看到分为3段每段就是上面的一部分数据。 什么是 JWT – JSON WEB TOKEN 傻傻分不清之 Cookie、Session、Token、JWT JWT详细教程与使用
2.编写JWT工具
我们会用到比较流行的java语言的JWT工具jjw
2.1.添加JWT依赖
我们需要先在项目中引入JWT依赖 dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.11.2/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.11.2/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.11.2/versionscoperuntime/scope/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencydependencygroupIdjoda-time/groupIdartifactIdjoda-time/artifactId/dependency!--json工具--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--日期时间工具类--dependencygroupIdjoda-time/groupIdartifactIdjoda-time/artifactId/dependency!--redis--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency2.2.载荷对象
JWT中会保存载荷数据我们计划存储2部分
jtijwt的idUserDetail用户数据
为了方便后期获取我们定义一个类来封装。
添加一个实体类代表载荷信息 import lombok.Data;//载荷对象
Data
public class Payload {/*** tocken的id*/private String jti;/*** 用户数据*/private UserDetail userDetail;
}
载荷中的UserDetail信息也需要一个实体类表示这里我们定义一个UserDetail类。
这里我们假设用户信息包含2部分
id用户idusername用户名
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Data
AllArgsConstructor(staticName of)
NoArgsConstructor
public class UserDetail {/*** 用户id*/private Long id;/*** 用户名*/private String username;
}
2.3.工具
我创建一个JwtUtils 工具类用来封装几个方法
createJwt() 生成JWTparseJwt() 验证并解析JWT
import com.example.jwt.constants.RedisConstants;
import com.example.jwt.dto.Payload;
import com.example.jwt.dto.UserDetail;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;import javax.crypto.SecretKey;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.UUID;
import java.util.concurrent.TimeUnit;public class JwtUtils {/*** JWT解析器*/private final JwtParser jwtParser;/*** 秘钥*/private final SecretKey secretKey;// Autowiredprivate StringRedisTemplate redisTemplate;private final static ObjectMapper mapper new ObjectMapper();public JwtUtils(String key) {// 生成秘钥secretKey Keys.hmacShaKeyFor(key.getBytes(Charset.forName(UTF-8)));// JWT解析器this.jwtParser Jwts.parserBuilder().setSigningKey(secretKey).build();}/*** 生成jwt自己指定的JTI** param userDetails 用户信息* return JWT*/public String createJwt(UserDetail userDetails) {try {// 生成tokenidString jticreateJti();//存入redis中
// this.redisTemplate.opsForValue().set(RedisConstants.JTI_KEY_PREFIXuserDetails.getUsername(),jti,30, TimeUnit.MINUTES);return Jwts.builder().signWith(secretKey).setId(jti).claim(user, mapper.writeValueAsString(userDetails)).compact();} catch (JsonProcessingException e) {throw new RuntimeException(e);}}/*** 解析jwt并将用户信息转为指定的Clazz类型** param jwt token* return 载荷包含JTI和用户信息*/public Payload parseJwt(String jwt) {try {JwsClaims claimsJws jwtParser.parseClaimsJws(jwt);Claims claims claimsJws.getBody();Payload payload new Payload();payload.setJti(claims.getId());payload.setUserDetail(mapper.readValue(claims.get(user, String.class), UserDetail.class));return payload;} catch (IOException e) {throw new RuntimeException(e);}}private String createJti() {return StringUtils.replace(UUID.randomUUID().toString(), -, );}/*** 刷新jwt有效期* param username*/public void refreshJwt(String username) {String key RedisConstants.JTI_KEY_PREFIXusername;//重置key的过期时间redisTemplate.expire(key,30,TimeUnit.MINUTES);}
} 2.4.测试
2.4.1.配置秘钥
在application.yml文件中配置秘钥
yy:jwt:key: helloWorldJavaAuthServiceSecretKe定义一个配置类注册JwtUtils注入到Spring的容器。 import com.example.jwt.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class JwtConfig {Value(${yy.jwt.key})private String key;Beanpublic JwtUtils jwtUtils(){return new JwtUtils(key);}
}
2.4.2.测试类 Autowiredprivate JwtUtils jwtUtils;Testpublic void test() {// 生成jwtString jwt jwtUtils.createJwt(UserDetail.of(112L, lele));System.out.println(jwt jwt);// 解析jwtPayload payload jwtUtils.parseJwt(jwt);System.out.println(payload payload);}结果
jwt eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyZTRkMGI1NjZiODY0YjUzODAwZTI3NGNhOWE0MTcxYSIsInVzZXIiOiJ7XCJpZFwiOjExMixcInVzZXJuYW1lXCI6XCJsZWxlXCJ9In0.NGa42tISwsLg_hyONasdGPGDigFFxkWbH04wd4ELztY
payload Payload(jti2e4d0b566b864b53800e274ca9a4171a, userDetailUserDetail(id112, usernamelele))
文章转载自: http://www.morning.qdlr.cn.gov.cn.qdlr.cn http://www.morning.routalr.cn.gov.cn.routalr.cn http://www.morning.gynls.cn.gov.cn.gynls.cn http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn http://www.morning.jzykq.cn.gov.cn.jzykq.cn http://www.morning.mfxcg.cn.gov.cn.mfxcg.cn http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn http://www.morning.tqrbl.cn.gov.cn.tqrbl.cn http://www.morning.khcpx.cn.gov.cn.khcpx.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.pwmm.cn.gov.cn.pwmm.cn http://www.morning.rhqn.cn.gov.cn.rhqn.cn http://www.morning.rdmz.cn.gov.cn.rdmz.cn http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.ltpzr.cn.gov.cn.ltpzr.cn http://www.morning.hnrpk.cn.gov.cn.hnrpk.cn http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.zxznh.cn.gov.cn.zxznh.cn http://www.morning.jltmb.cn.gov.cn.jltmb.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.lnyds.cn.gov.cn.lnyds.cn http://www.morning.trfh.cn.gov.cn.trfh.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.nrchx.cn.gov.cn.nrchx.cn http://www.morning.krlsz.cn.gov.cn.krlsz.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.lnbcx.cn.gov.cn.lnbcx.cn http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn http://www.morning.mmxt.cn.gov.cn.mmxt.cn http://www.morning.bchfp.cn.gov.cn.bchfp.cn http://www.morning.tzzxs.cn.gov.cn.tzzxs.cn http://www.morning.drspc.cn.gov.cn.drspc.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.dtzxf.cn.gov.cn.dtzxf.cn http://www.morning.kbntl.cn.gov.cn.kbntl.cn http://www.morning.bkwd.cn.gov.cn.bkwd.cn http://www.morning.mmxt.cn.gov.cn.mmxt.cn http://www.morning.mngh.cn.gov.cn.mngh.cn http://www.morning.ztqj.cn.gov.cn.ztqj.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.zztmk.cn.gov.cn.zztmk.cn http://www.morning.kldtf.cn.gov.cn.kldtf.cn http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.jqpq.cn.gov.cn.jqpq.cn http://www.morning.zmyhn.cn.gov.cn.zmyhn.cn http://www.morning.spftz.cn.gov.cn.spftz.cn http://www.morning.dzdtj.cn.gov.cn.dzdtj.cn http://www.morning.grcfn.cn.gov.cn.grcfn.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.wknbc.cn.gov.cn.wknbc.cn http://www.morning.gl-group.cn.gov.cn.gl-group.cn http://www.morning.htbbp.cn.gov.cn.htbbp.cn http://www.morning.qflcb.cn.gov.cn.qflcb.cn http://www.morning.c7507.cn.gov.cn.c7507.cn http://www.morning.tdnbw.cn.gov.cn.tdnbw.cn http://www.morning.npfkw.cn.gov.cn.npfkw.cn http://www.morning.mwpcp.cn.gov.cn.mwpcp.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.bpmnz.cn.gov.cn.bpmnz.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.rccpl.cn.gov.cn.rccpl.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.bmts.cn.gov.cn.bmts.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn http://www.morning.kysport1102.cn.gov.cn.kysport1102.cn http://www.morning.ktyww.cn.gov.cn.ktyww.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn