1) flask使用session验证一般都是web开发
1. 第一次客服端使用用户名,密码登陆 。服务端如果验证通过,一般会保存用户ID,用户名等信息到session并设置过期时间,并返回session_id给客服端。
2. 以后在session没过期的情况下可以使用session机制验证。
3. 如果客服端清理了session_id或服务端清理了对应的session空间就不能用session机制了,要重新开始。
def login_required(view_func):
@functools.wraps(view_func) #
def wrapper(*args, **kwargs):
# 判断用户的登录状态
user_id = session.get('user_id')
# 如果未登录,返回未登录的信息
if not user_id:
return jsonify(code = 10001, msg='用户未登录')
# 如果用户是登录的,执行视图函数
g.user_id = user_id
return view_func(*args, **kwargs)
return wrapper
2) flask使用token验证一般都是手机app开发
1. 第一次客服端使用用户名,密码登陆 。服务端如果验证通过,一般会保存用户ID,用户名等信息到自己生成的token中并设置过期时间,并返回token给客服端。
2. 以后在token没过期的情况下可以使用token机制验证。
3. 如果客服端清理了token数据就不能用token机制了,要重新开始。
#导入依赖包
import functools
from flask import request,jsonify,current_app, jsonify, g
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
app = Flask(__name__)
# 生成token
def create_token(user_id):
'''
:param user_id: 用户id
:return: token
'''
#第一个参数是内部的私钥,这里写在共用的配置信息里了
s = Serializer(current_app.config["SECRET_KEY"],expires_in=18000)
token = s.dumps({"id": user_id}).decode("ascii")
return token
# 校验token
def verify_token(token):
'''
:param token:
:return: user_id or None
'''
#参数为私有秘钥,跟上面方法的秘钥保持一致
s = Serializer(current_app.config["SECRET_KEY"])
try:
#转换为字典
data = s.loads(token)
except Exception:
return None
user_id = data.get("id")
return user_id
# 使用装饰器写一个必须携带token的校验
def login_required(view_func):
@functools.wraps(view_func)
def verify_token(*args,**kwargs):
token = request.headers.get("access-token")
if not token:
return jsonify(code = 10000,msg = '缺少参数token')
s = Serializer(current_app.config["SECRET_KEY"])
try:
data = s.loads(token)
except Exception:
return jsonify(code = 10001,msg = "token已无效")
g.user_id = data.get("id")
return view_func(*args,**kwargs)
return verify_token
网友评论