JWT+flask_jwt_extended学习笔记
作者:互联网
本来想今天下午就写完这个项目,结果今天晚上11点了才开始写,还是要坚持写完的啦!
自己的博客地址:http://blog.mc10010.com/index.php/archives/22/
JWT
参考文档: https://jwt.io/introduction
汉化版本: https://www.jianshu.com/p/576dbf44b2ae
应用场景
- 授权,即在一次登录后后续每个请求都包含jwt,用户使用该令牌可以访问被保护的路由和其他资源
- 信息交换,方便用来确定信息发送者就是我们指定的人,使用签名判断验证内容有没有被篡改
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好处
-
无状态和扩展性
储存在客户端,完全无状态,扩展性不知道怎么理解
-
安全性
由于token不是cookie,每次请求的时候token被发送,但是没有cookie发送,所以不存在CSRF攻击,并且一段时间后token会过期。
经过token撤销操作,他可以允许我们根据相同的授权许可使特定的token或者一组token无效
使用flask的JWT扩展
参考地址: https://flask-jwt-extended.readthedocs.io/en/stable/
基本用法
1.可使用create_access_token()
创建一个token
jwt_required()
来保护路由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()
标签:extended,flask,JWT,jwt,access,token,import 来源: https://blog.csdn.net/qq_54763246/article/details/117264480