zoukankan      html  css  js  c++  java
  • Python JWT使用

    什么是JWT

    参考资料

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

    Python JWT中的使用

    #!./usr/bin/env python
    # -*- coding: utf-8 -*-
    # Date: 2020/9/30
    # Author: Jimmy
    from datetime import timedelta, datetime
    
    import jose
    from jose import jwt
    
    SECRET_KEY: str = "yo5mCDHCnhOtyI60GPmuolPVYvX9pQzQQ1kdMwWMqcM"
    
    # 60 minutes * 24 hours * 8 days = 8 days
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8
    
    ALGORITHM = "HS256"
    
    
    def create_access_token(subject, expires_delta: timedelta = None) -> str:
        """
        生成一个 jwt token
        :param subject: token里存放的信息, 一般存放用户id
        :param expires_delta: 过期时间,单位:分钟
        :return:
        """
        now = datetime.utcnow()
        if expires_delta:
            expire = now + expires_delta
        else:
            expire = now + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    
        '''
        payload参数说明
            exp: 过期时间
            iat: 发布时间
            iss: 发布者
            sub: 面向的用户
        '''
        payload = {"exp": expire, "iat": now, "iss": "Jimmy", "sub": str(subject)}
    
        encoded_jwt = jose.jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
    
        return encoded_jwt
    
    
    def token_to_sub(token_str: str):
        """
        解码token
    
        jwt.decode 的异常:
            token过期:jose.exceptions.ExpiredSignatureError
            token无效:jose.exceptions.JWTError
            所有异常:jose.jwt.JWTError
    
        :param token_str:
        :return:
        """
        try:
            payload = jwt.decode(token_str, SECRET_KEY, algorithms=[ALGORITHM])
            return payload.get('sub')
    
        except jose.exceptions.ExpiredSignatureError:
            print('token已过期')
    
        except jose.exceptions.JWTError:
            print('token无效')
    
    
    if __name__ == '__main__':
        # 1. 生成一个 jwt token
        user_id = 66
        token = create_access_token(user_id, timedelta(minutes=1))
        print(f"生成的token:{token}")
    
        # 2. 获取 jwt token 里的用户id
        ret = token_to_sub(token)
        print(f"从token中获取到的用户id为:{ret}")
    
  • 相关阅读:
    PostMan 安装步骤详解
    使用MySQL,运行系统报错Authentication method 'caching_sha2_password' is not supported.
    jmeter安装和环境变量配置
    Svn项目迁移到Git及Visual Studio 中git使用
    SQLServer 2008以上误操作数据库恢复方法
    ABP入门系列之3——创建实体/Code First创建数据表
    ABP入门系列之2——ABP模板项目
    uni-app使用Canvas绘图
    uni-app中picker组件的一个坑
    Nginx用法详解
  • 原文地址:https://www.cnblogs.com/sunch/p/13755690.html
Copyright © 2011-2022 走看看