zoukankan      html  css  js  c++  java
  • Flask中的JWT

    Flask中的JWT


    Flask中的JWT
    JWT认证
    Json Web Token(JWT)
    JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。

    JWT是一个有着简单的统一表达形式的字符串:


    头部(Header)
    头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。

    载荷(PayLoad)
    payload的五个字段都是由JWT的标准所定义的。

    iss: 该JWT的签发者
    sub: 该JWT所面向的用户
    aud: 接收该JWT的一方
    exp(expires): 什么时候过期,这里是一个Unix时间戳
    iat(issued at): 在什么时候签发的
    后面的信息可以按需补充,JSON内容要经Base64 编码生成字符串成为PayLoad。

    签名(signature)
    这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。

    为什么使用JWT?
    解析: jwt (JSON WEB TOKEN) 是一个JSON格式的规范
    之前学过的认证方案: session的认证方案
    特点: 非常轻巧
    使用jwt替代session的原因:
    session是基于cookie的,所以在android和ios中,并不通用。为了统一前端认证方案,使用jwt。
    备注:
    我们一般说的jwt指的是jws。
    JWT的通讯流程


    JWS
    jws是一个jwt的一种实现方式。
    数据格式:
    header.payload.signature
    1.header(头部):头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。
    2.payload(载荷): 可以简单的理解为我们自己要传输的数据
    3.signature(签名)
    备注:
    1.JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。
    2.但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。

    JWE
    jwe是一个jwt的另外一种实现方式。
    备注:
    JWE的计算过程相对繁琐,不够轻量级,因此适合与数据传输而非token认证,但该协议也足够安全可靠,用简短字符串描述了传输内容,兼顾数据的安全性与完整性。
    我们平时说的jwt一般还是指的是jws.

    JWT刷新


    pyjwt

    生成token

    import jwt
    token = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
    # 有时效的token
    token = jwt.encode({'some': 'payload','exp':有效期的截止时间的时间戳}, 'secret', algorithm='HS256')

    验证token

    import jwt
    jwt.decode(token, "secret")

    # 如果验证失败,抛出异常jwt.PyJWTError
    # 如果token中的payload中包含了exp字段,decode方法会同时检验是否过期

    示例
    import jwt
    from flask import current_app

    def generate_jwt(payload, expiry, secret=None):
    """
    生成jwt
    :param payload: dict 载荷
    :param expiry: datetime 有效期
    :param secret: 密钥
    :return: jwt
    """
    _payload = {'exp': expiry}
    _payload.update(payload)

    if not secret:
    secret = current_app.config['JWT_SECRET']

    token = jwt.encode(_payload, secret, algorithm='HS256')
    return token.decode()

    def verify_jwt(token, secret=None):
    """
    检验jwt
    :param token: jwt
    :param secret: 密钥
    :return: dict: payload
    """
    if not secret:
    secret = current_app.config['JWT_SECRET']

    try:
    payload = jwt.decode(token, secret, algorithm=['HS256'])
    except jwt.PyJWTError:
    payload = None

    return payload

    JWT安全防护的机制

     

    我们只需要努力,然后剩下的交给时间。
  • 相关阅读:
    visual studio code 中文
    vue中常用插件(货币、日期)
    PS与CSS字间距转换
    常用css样式(文字超出部分用省略号显示、鼠标经过图片放大、出现阴影)
    swiper在一个页面多个轮播图
    git上传项目
    Win10下安装SVN出现2503/2502解决方法
    关于yii2学习笔记:gii的使用
    nginx反向代理解决跨域
    树莓派4安装centos
  • 原文地址:https://www.cnblogs.com/lgj8/p/14737978.html
Copyright © 2011-2022 走看看