一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客

  深入了解Json Web Token之概念篇

  另附 JWT 的官方文档: https://jwt.io/introduction/

二.python 对于 jwt 的实现, 目前已经存在了一些第三方的库, 相信学习过 python 的程序猿都知道 itsdangerous 这个库了, 它的底层原理就是基于 jwt 进行实现的

  这里需要进行提醒的是:

  itsdangerous (使用固定密钥/字符串进行加密, jwt 有多种加密方式, 这只是其中一种, 建议先去了解一下)所生成的 token 仍然是可以被破译从而看到 jwt 的 payload(有效负载) 里的数据, 只不过因为破译者并不知道加密的密钥, 也就无法对数据进行篡改, 所以如果是私密的数据, 就不应该使用 jwt 进行传递, 如 账号的密码, 以防止泄露. 如果需要传递私密数据, 解决办法是,对 payload 的数据进行加密,从而杜绝非法破译者看到 payload 内的任何信息,但是目前加密payload的操作不是很普及,在不加密 payload 的前提下, jwt 比较适合进行非受信任端的身份验证, 此时即使接收方破译了 token, 看到了 payload 的数据, 也不会造成太大的影响, 因为数据是无法被篡改的(当接收方将 token 值返回给服务器后, 需要使用相同的密钥进行解密, 所以服务器的密钥一定要保管好), 只要接收方将 token 原封不动的返回给服务器, 那么服务器就可以根据 token 值的内容来确认接收方身份的合法性,而不需要关心接收方是否看到过 payload 的内容.

  简而言之, 除非额外对 payload 加密过, 否则就不要在 jwt 中传递不可被第三方获知的私密数据

三. python实现生成 json web token

  环境: python3.6.7

  依赖包: jwt, time

  1)JWT 的签名算法有三种。

    1.对称加密HMAC【哈希消息验证码】  HS256/HS384/HS512

      这种加密方式没有公钥,私钥之分, 也就是只有一个密钥, 这种加密方式适用于: 服务器将生成的jwt发送给接收方, 接收方将其返回给服务器, 服务器解析 jwt, 完成身份验证.

     2.非对称加密RSASSA【RSA签名算法】RS256/RS384/RS512

     3.ECDSA【椭圆曲线数据签名算法】 ES256/ES384/ES512

  2).对称加密HMAC 生成 jwt

import time
import jwt # payload
token_dict = {
'iat': time.time(), # 时间戳
   'name': 'lowman' # 自定义的参数
}
"""payload 中一些固定参数名称的意义, 同时可以在payload中自定义参数"""
# iss 【issuer】发布者的url地址
# sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段
# aud 【audience】接受者的url地址
# exp 【expiration】 该jwt销毁的时间;unix时间戳
# nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳
# iat 【issued at】 该jwt的发布时间;unix 时间戳
# jti 【JWT ID】 该jwt的唯一ID编号
# headers
headers = {
'alg': "HS", # 声明所使用的算法
} """headers 中一些固定参数名称的意义"""
# jku: 发送JWK的地址;最好用HTTPS来传输
# jwk: 就是之前说的JWK
# kid: jwk的ID编号
# x5u: 指向一组X509公共证书的URL
# x5c: X509证书链
# x5t:X509证书的SHA-1指纹
# x5t#S256: X509证书的SHA-256指纹
# typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。
# crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。
# 调用jwt库,生成json web token
jwt_token = jwt.encode(token_dict, # payload, 有效载体
"zhananbudanchou1234678", # 进行加密签名的密钥
algorithm="HS256", # 指明签名算法方式, 默认也是HS256
headers=headers # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
).decode('ascii') # python3 编码后得到 bytes, 再进行解码(指明解码的格式), 得到一个str print(jwt_token) # 个人测试生成结果如下: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijk1MjcifQ.eyJpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbiJ9.GyQhOJK8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY

  3) 使用 python 对 jwt 进行解析


import jwt
# 将上面生成的 jwt 进行解析认证

jwt_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijk1MjcifQ.eyJpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbiJ9.GyQhOJK8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY"

data = None
try:
  # 需要解析的 jwt 密钥 使用和加密时相同的算法
  data = jwt.decode(token, "zhananbudanchou1234678", algorithms=['HS256'])
except Exception as e:
  # 如果 jwt 被篡改过; 或者算法不正确; 如果设置有效时间, 过了有效期; 或者密钥不相同; 都会抛出相应的异常
  print(e) # 解析出来的就是 payload 内的数据
print(data) # 输出: {'iat': 1559276941.4208837, 'name': 'lowman'}

  

  4)如果是使用私钥公钥进行加密解密的方式(由请求方使用私钥进行加密生成 jwt, 接收方使用公钥解密), 只需要将相应参数更换成私钥(将私钥证书读取出来, 赋值给相应参数即可), 并使用双方约定好的的签名算法

  5)  python 对于 jwt 的实现, 已经有了 itsdangerous 这个库做了很好的支撑, 使用起来还是很方便的, 大家可以自行去了解一下.

    itsdangerous 官方文档: https://itsdangerous.readthedocs.io/en/1.1.x/

最新文章

  1. python 字典 注意点
  2. Memcached监听多个端口_同一台Windows机器中启动多个Memcached服务
  3. SQL Server 2012 各版本功能比较
  4. iOS开发——动画编程Swift篇&(三)CATransition动画
  5. 怎样提交FIREDAC数据集的DELTA到中间件然后保存进数据库
  6. 【HDOJ】4251 The Famous ICPC Team Again
  7. DevExpress gridcontrol添加了复选框删除选中的多行/批量删除的方法
  8. java工程师联通XX面试题目
  9. 跨域请求,jsonp
  10. kaggle Titanic心得
  11. Appium环境搭建(Windows版)
  12. Outlook邮箱配置
  13. 自守数算法----C语言实现
  14. Postman 安装
  15. C++设计模式——装饰模式
  16. leetcode-83.删除排序链表中的重复元素
  17. JSOUP 超时分析与处理
  18. python中安装并使用redis
  19. XP系统安装VS2010失败的解决方法
  20. C#基础视频教程1 背景知识和安装配置

热门文章

  1. 写代码如何合理使用和优化我们的机器资源(CPU、内存、网络、磁盘)
  2. .Net Core 3 骚操作 之 用 Windows 桌面应用开发 Asp.Net Core 网站
  3. java中参数" ..."的用法和意思
  4. JAVA 8 的新特性
  5. Java开发笔记(一百五十)C3P0连接池的用法
  6. kali更新软件源
  7. svg 直线水平渐变为什么没有效果,必须得是一条倾斜的不水平的直线才有渐变效果呢??
  8. Mybatis自动生成代码工具
  9. 用lua求两个数组的交集、并集和补集。
  10. form表单提交数据给后台