最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证。转用JWT。

其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT 。

JWT官网

https://jwt.io/

安装

pip install PyJWT

项目文档(英文)

https://pyjwt.readthedocs.io/en/latest/

Demo

import jwt
import datetime dic = {
'exp': datetime.datetime.now() + datetime.timedelta(days=), # 过期时间
'iat': datetime.datetime.now(), # 开始时间
'iss': 'lianzong', # 签名
'data': { # 内容,一般存放该用户id和开始时间
'a': ,
'b': ,
},
} s = jwt.encode(dic, 'secret', algorithm='HS256') # 加密生成字符串
print(s)
s = jwt.decode(s, 'secret', issuer='lianzong', algorithms=['HS256']) # 解密,校验签名
print(s)
print(type(s))

结果

b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDUzMDI5OTIsImlhdCI6MTU0NTIxNjU5MiwiaXNzIjoibGlhbnpvbmciLCJkYXRhIjp7ImEiOjEsImIiOjJ9fQ.pSq-XRcC-E7zeg3u0X6TsKdhhsCPh3tB40_YJNho8CY'
{'exp': , 'iat': , 'iss': 'lianzong', 'data': {'a': , 'b': }}
<class 'dict'>

解析

首先我们注意dic的结构

dic 有官方指定的key,程序在解密的时候会根据key的Value判断是否合法。这些key有

  • “exp”: 过期时间
  • “nbf”: 表示当前时间在nbf里的时间之前,则Token不被接受
  • “iss”: token签发者
  • “aud”: 接收者
  • “iat”: 发行时间

我们一般设置 过期时间,发行时间,接收者。我们来分别解释这些key

exp

exp指过期时间,在生成token时,可以设置该token的有效时间,如果我们设置1天过期,1天后我们再解析此token会抛出

jwt.exceptions.ExpiredSignatureError: Signature has expired

nbf

nbf类似于token的 lat ,它指的是该token的生效时间,如果使用但是没到生效时间则抛出

jwt.exceptions.ImmatureSignatureError: The token is not yet valid (nbf)

iss

iss指的是该token的签发者,我们可以给他一个字符串。

注意,iss 在接收时如果不检验也没有问题,如果我们接收时需要检验但是又签名不一致,则会抛出

jwt.exceptions.InvalidIssuerError: Invalid issuer

aud

aud指定了接收者,接收者在接收时必须提供与token要求的一致的接收者(字符串),如果没写接收者或者接收者不一致会抛出

jwt.exceptions.InvalidAudienceError: Invalid audience

iat

iat指的是token的开始时间,如果当前时间在开始时间之前则抛出

jwt.exceptions.InvalidIssuedAtError: Issued At claim (iat) cannot be in the future.

注意

如果我们不需要验证所有信息直接生成token可以设置

jwt.decode(encoded, verify=False)

但是这样有什么用呢?

生成/解密参数

jwt.encode(payload, config.SECRET_KEY, algorithm='HS256')

上面代码的jwt.encode方法中传入了三个参数:第一个是payload,这是认证依据的主要信息,第二个是密钥,这里是读取配置文件中的SECRET_KEY配置变量,第三个是生成Token的算法。

一般我们使用HS256

第二个参数是生成token的密钥

我们需要在加密时指定

解密时也是第二个参数来指定解密密钥,这两个密钥必须相同

PyJWT 使用的更多相关文章

  1. flask_login 整合 pyjwt + json 简易flask框架

    现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...

  2. Pyjwt ,python jwt ,jwt

    pip install Pyjwt 不错的jwt 文章: https://www.cnblogs.com/wayneiscoming/p/7513487.html Sampleimport jwt i ...

  3. flask-login 整合 pyjwt + json 简易flask框架

    现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...

  4. 五 pyJWT使用

    PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的. 1:安装PyJWT 2:  直接上代码了: import datetime, jwt, time from a ...

  5. pyJWT

    现在用JWT 加密太火了,怎么能不跟上潮流?否则销售都不好意思出去吹牛逼! PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的 1.定义:根据维基百科的定义,JSO ...

  6. PyJWT 详解

    1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...

  7. Python 资源大全中文版

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  8. 使用 AngularJS & NodeJS 实现基于token 的认证应用(转)

    认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构 ...

  9. [转载]Python 资源大全

    原文链接:Python 资源大全 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex  ...

随机推荐

  1. List、Map、set的加载因子,默认初始容量和扩容增量

    首先,这三个概念说下.初始大小,就是创建时可容纳的默认元素个数:加载因子,表示某个阀值,用0~1之间的小数来表示,当已有元素占比达到这个阀值后,底层将进行扩容操作:扩容方式,即指定每次扩容后的大小的规 ...

  2. java基础之自定义异常类及throw和throws的区别

    一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...

  3. 十二、u-boot 调试--串口修改

    uboot 烧写进 norflash 进行调试 12.1 烧写后 串口不使能 内存不能使能 遍历代码,可以发现,在SDRAM 初始化之前,我们并没有设置时钟,但是SDRAM初始化后,我们已经开始用内存 ...

  4. 20155324 《Java程序设计》实验四 Android开发基础

    20155324 <Java程序设计>实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件. ...

  5. Oracle 数据库监听配置和服务

    -- 补充说明 如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) PLSQL Dev ...

  6. call apply bind 区别?

    call apply bind 区别? 例:定义一个计算器,没绑定bind的为公共计算器,call可以调用,绑定bind的为私人计算器,别人调用不了, //ps:用bind绑定的call强制作借用不好 ...

  7. ubuntu完全卸载mysql

    可以先用 dpkg --list|grep mysql 查看自己的mysql有哪些依赖 一.先卸载 mysql-common sudo apt-get remove mysql-common 二.然后 ...

  8. MySQL - GROUP BY和HAVING的用法

    按姓名分组查询 SELECT username, COUNT(username) AS '人数' FROM t_user GROUP BY username 只查询姓名相同的人 SELECT user ...

  9. 7.4mybatis整合ehcache(mybatis无法实现分布式缓存必须和其他缓存框架整合)

    <\mybatis\day02\14查询缓存-二级缓存-整合ehcache.av> mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache-- 这里有做本 ...

  10. Redis 集群环境的搭建

    下载与解压 [root@localhost ~]# cd /usr/temp/ [root@localhost temp]# wget http://download.redis.io/release ...