JWT+flask_jwt_extended学习笔记

本来想今天下午就写完这个项目,结果今天晚上11点了才开始写,还是要坚持写完的啦!
自己的博客地址:http://blog.mc10010.com/index.php/archives/22/

JWT

参考文档: https://jwt.io/introduction

汉化版本: https://www.jianshu.com/p/576dbf44b2ae

应用场景

  1. 授权,即在一次登录后后续每个请求都包含jwt,用户使用该令牌可以访问被保护的路由和其他资源
  2. 信息交换,方便用来确定信息发送者就是我们指定的人,使用签名判断验证内容有没有被篡改

jwt构成

JWT分为header、payload和signature三部分,每部分之间用(.)来连接,例如

xxxx.yyyyy.zzzzzz

header

header有两部分组成,token的类型(“JWT”)和加密算法名称,比如HMAC,使用Base64加密得到第一部分header

例如

{
    'alg':'HS256',
    'typ':"JWT"
}

payload

存放信息主体

例如

{
    "sub": '1234567890',
    "name": 'john',
    "admin":true
}

signature

signature是签名信息,通过编码后的header和payload,密钥+签名算法即可得到签名

用于验证信息是否被篡改,以及验证发送方是否为他指定的发送方

请求过程

用户携带用户名和密码请求访问->服务器校验用户凭据 ->应用提供一个token给客户端->客户端存储token,并且在随后的每一次请求中都带着它->服务器校验token并返回数据

Token好处

  1. 无状态和扩展性

    储存在客户端,完全无状态,扩展性不知道怎么理解

  2. 安全性

    由于token不是cookie,每次请求的时候token被发送,但是没有cookie发送,所以不存在CSRF攻击,并且一段时间后token会过期。

    经过token撤销操作,他可以允许我们根据相同的授权许可使特定的token或者一组token无效

使用flask的JWT扩展

参考地址: https://flask-jwt-extended.readthedocs.io/en/stable/

基本用法

1.可使用create_access_token()创建一个token

  1. jwt_required()来保护路由
  2. get_jwt_identity()来获得token所对应的身份,但是使用该方法的路由必须是被token保护的路由

官方简例:

from flask import Flask
from flask import jsonify
from flask import request

from flask_jwt_extended import create_access_token
from flask_jwt_extended import get_jwt_identity
from flask_jwt_extended import jwt_required
from flask_jwt_extended import JWTManager

app = Flask(__name__)

# Setup the Flask-JWT-Extended extension
app.config["JWT_SECRET_KEY"] = "super-secret"  # Change this!
jwt = JWTManager(app)


# Create a route to authenticate your users and return JWTs. The
# create_access_token() function is used to actually generate the JWT.
@app.route("/login", methods=["POST"])
def login():
    username = request.json.get("username", None)
    password = request.json.get("password", None)
    if username != "test" or password != "test":
        return jsonify({"msg": "Bad username or password"}), 401

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token)


# Protect a route with jwt_required, which will kick out requests
# without a valid JWT present.
@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
    # Access the identity of the current user with get_jwt_identity
    current_user = get_jwt_identity()
    return jsonify(logged_in_as=current_user), 200


if __name__ == "__main__":
    app.run()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值