需求:
- 小程序或者webapi的token验证,所以token需要放到header里面
- 需要复用flask-login内置 login_required用于验证已登录
原理:
在进行login_required权鉴的时候,flask-login 有3种验证方式
- login_manager.user_loader
其实就是session验证,小程序或者webapi不太实用
- login_manager.request_loader
验证信息放入到request对象,request对象可以从header,body,values等等中获取,很灵活
- login_manager.header_loader
从header中获取验证,使用起来与session一致
选型:
由于需要放到header里面,所有只能选2、3方案。
再者,token字段为自定义且内容也是自定义,所以直接选2(方案3要走弯路。。。)
代码:
伪代码app.py
from flask import Flask,request,jsonify,redirect,url_for
from flask_login import login_user,login_required,logout_user
from exts import loginManager
from models import UserModel
app = Flask(__name__)
# 123是加密key,你可以随意
app.config['SECRET_KEY'] = '123'
loginManager.init_app(app=app)
# 登录页面,验证用户名就行了
@app.route('/login')
def login():
if request.values.get('username') == 'admin':
user = UserModel()
user.id = 0
user.username = 'admin'
user.password = 'admin'
# 123是伪代码,可以根据具体情况生成token
token = '123'
return redirect(url_for('home',token=token))
return redirect(url_for('index'))
# 需要权限的home页面,成功后会跳转
@app.route('/home')
@login_required
def home():
return '<h1>home</h1><a href="./logout">退出</a>'
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/')
def index():
return '<a href="./login?username=admin">跳转登录</a>'
# 这个地方最重要,用于验证当前的token是否已经登录
@loginManager.request_loader
def user_loader(request):
token = request.values.get('token')
# 伪代码,用于验证token,具体看自己的业务
if token == '123':
user = UserModel()
user.id = id
user.username = 'admin'
user.password = 'admin'
return user
伪代码exts.py
from flask_login import LoginManager,UserMixin
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()
loginManager = LoginManager()
伪代码models.py
from exts import db,UserMixin
class UserModel(db.Model,UserMixin):
id = db.Column(db.Integer,primary_key = True)
username = db.Column(db.String)
password = db.Column(db.String)
结束
令牌生成可以使用这个类,百度简单搜索看一下就ok了
from itsdangerous import TimedJSONWebSignatureSerializer
网友评论