JWT令牌简介及用法

Jwt令牌

简介

全称:JSON Web Token (jwt.io)

定义了一种简介、自包含的格式,用于在通信双方以json数据格式安全的传输信息,由于数字签名的存在这些信息是可靠的

组成

  • 第一部分:Header(头),记录令牌类型、签名算法等。例如:{ralg":“HS256”,“type”:"JWT}
  • 第二部分:Payload(有效裁荷),携带一些自定义信息、默认信息等。例如:[rid":“1”,“username”:"Tom}
  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

在这里插入图片描述

登录认证

  1. 登录成功后,生成令牌
  2. 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理

在这里插入图片描述

maven坐标

<dependency>
	<groupld>io.jsonwebtoken</groupld>
	<artifactld>jwt</artifactld>
	<version>0.9.1</version>
</dependency>

令牌生成

@Test
public void genjwt(){
    Map<String,Object> claims = new HashMap<>();
    claims.put("id",1);
    claims.put("username","Tom");
    String jwt = jwts.builder()
        .setClaims(claims)//自定义内容
        .signWith(SignatureAlgorithm.HS256,"itheima")//数字签名
        .setExpiration(new Date(System.currentTimeMillis())+12*3600*100)//有效期
        .compact();
}

令牌校验

@Test
public void parsejwt(){
    Claims claims = Jwts.parser()
        .setSigningKey("itheima")
        .parseClaimsjws(token)//需要解析的令牌
        .getBody()
}

注意

  • JWT校验时使用的签名秘钥,必须和生成WT令牌时使用的秘钥是配套的。
  • 如果JWT令牌解析校验时报错,则说明JWT令牌被纂改或失效了,令牌非法。
### 使用JWT令牌进行身份验证和授权 #### FastAPI中的JWT令牌应用实例 在现代Web开发中,FastAPI框架提供了一种简洁而高效的方式来进行基于JWT的身份验证。为了实现这一功能,在应用程序初始化阶段需引入必要的依赖库[^1]。 ```python from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer import jwt from datetime import datetime, timedelta ``` 定义OAuth2密码承载者模式用于获取请求头中的`Authorization`字段: ```python oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") ``` 创建函数来生成新的JWT令牌,此过程涉及设置过期时间和编码payload数据: ```python def create_access_token(data: dict, expires_delta: timedelta | None = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=15) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, "secret_key", algorithm="HS256") return encoded_jwt ``` 编写中间件或依赖项处理器用来解码传入HTTP头部携带的JWT并提取用户信息,如果失败则抛出异常阻止进一步处理: ```python async def get_current_user(token: str = Depends(oauth2_scheme)): credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) try: payload = jwt.decode(token, "secret_key", algorithms=["HS256"]) username: str = payload.get("sub") if username is None: raise credentials_exception except jwt.PyJWTError: raise credentials_exception # 这里可以根据username查询数据库获得完整的User对象 user = {"username": username} return user ``` 上述代码片段展示了如何利用Python下的FastAPI框架快速搭建起一套简单的基于JWT的身份认证系统。 #### Spring Boot中的JWT令牌校验流程 对于Java开发者而言,Spring Boot提供了强大的安全性支持,允许通过自定义过滤器链轻松集成JWT令牌验证逻辑。当接收到客户端发送过来带有Token参数的HTTPS请求时,服务器会先经过一系列预设的安全拦截点,其中就包含了专门负责解析与检验Token有效性的组件——JwtAuthenticationFilter[^2]。 一旦成功完成Token合法性确认之后,该插件还会自动填充当前线程上下文中有关已登录用户的权限详情,从而简化后续业务层面对不同角色访问控制的需求判断逻辑。 #### JWT的工作原理及其优势概述 JSON Web Tokens (JWTs) 是一种紧凑且URL安全的数据结构,旨在促进跨域间的信息交流。由于其采用加密算法进行了数字签名保护,所以接收方可放心地信赖所载荷的内容未被篡改。此外,相较于传统的Session-based方案来说,无状态特性使得服务端无需保存任何关于活跃会话的状态记录,进而降低了存储开销以及提升了横向扩展能力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值