让 pyjwt 在token将要过期时给出提示

在pyjwt中,decode时如果token过期,则会报出jwt.ExpiredSignatureError的错误,但是当token快要过期时,却没有相应的提示

此方法会重写 PyJWT 的 _validate_exp 函数,以实现该功能

示例依托于 django

首先需要安装 pyjwt 模块

pip3 install pyjwt

1.在项目目录下创建 utils/jwt 子目录

请添加图片描述

2.在jwt目录中分别创建 _init_.py 和 api_jwt.py 文件

# api_jwt.py
# 适用于 pyjwt = 1.7.1 其余版本未测试
from jwt.api_jwt import PyJWT
from jwt.exceptions import DecodeError, ExpiredSignatureError


class MyJWT(PyJWT):
    def _validate_exp(self, payload, now, leeway):
        try:
            exp = int(payload['exp'])
        except ValueError:
            raise DecodeError('Expiration Time claim (exp) must be an'
                              ' integer.')

        if exp < (now - leeway):
            raise ExpiredSignatureError('Signature has expired')
        # 在 payload 添加一个字段 retoken ,类型为布尔值,当为True时表示需要给前端发送新的token
        # token 有效期小于三天,则将 retoken 置为 True ,想要设置多长时间自己改
        payload['retoken'] = True if exp - now < 3600 * 24 * 3 else False


_jwt_global_obj = MyJWT()
encode = _jwt_global_obj.encode
decode = _jwt_global_obj.decode
register_algorithm = _jwt_global_obj.register_algorithm
unregister_algorithm = _jwt_global_obj.unregister_algorithm
get_unverified_header = _jwt_global_obj.get_unverified_header
# __init__.py
# -*- coding: utf-8 -*-
# flake8: noqa

"""
使 jwt 能够在 token 即将过期时给出提示
重写 PyJWT 的 _validate_exp 函数,以实现该功能
"""


__title__ = 'myjwt'
__version__ = 'pyjwt = 1.7.1'
__author__ = 'MOYU'
__license__ = ''
__copyright__ = ''


from .api_jwt import (encode, decode, register_algorithm, unregister_algorithm, get_unverified_header, MyJWT)

使用方式

# 使用方式和原来的 jwt 一摸一样
import time
from utils import jwt

token_str = jwt.encode({'code': '123456', 'exp': int(time.time()) + 3600}, key='123456')
payload = jwt.decode(token_str, key='123456')
print(payload)


>>> {'code': '123456', 'exp': 1635410344, 'retoken': True}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Security中,可以使用过滤器来检查token是否过期。具体实现步骤如下: 1. 创建一个继承自`OncePerRequestFilter`的过滤器,用于检查token是否过期: ```java public class JwtTokenAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = extractToken(request); // 检查token是否过期,如果过期则返回错误信息 if (isTokenExpired(token)) { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token has expired"); return; } chain.doFilter(request, response); } private boolean isTokenExpired(String token) { // 解析token获取过期间 Date expiration = getExpirationDateFromToken(token); // 检查当前间是否晚于过期间 return expiration.before(new Date()); } private String extractToken(HttpServletRequest request) { // 从请求头或请求参数中获取token String bearerToken = request.getHeader("Authorization"); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { return bearerToken.substring(7); } return request.getParameter("token"); } private Date getExpirationDateFromToken(String token) { // 解析token获取过期间 return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration(); } } ``` 2. 在Spring Security配置中将该过滤器添加到过滤器链中: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/authenticate").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtTokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } } ``` 这样,当请求经过该过滤器,将会检查token是否过期,并在token过期返回错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值