14.(后端)登录装饰器(验证用户是否登录)

1.登录装饰器的介绍

当有业务访问时,必须登陆过才可以访问,为了避免每次编写代码,我们可以写一个装饰来验证用户是否登录

2.验证方法的逻辑

由于在上一篇文章中介绍了token的使用方式,我们就可以验证这个ip地址登陆上来的用户,是否携带token。如果携带,就代表他已经登陆了,如果没有携带,他就没有登入。

3.创建装饰器

# flask_shop/utils/tokens.py
'''
1.加密的数据    uid
2.算法          python模块
3.密钥          flask_app SECRET_KEY
'''

# 签证序列化
from ast import arg
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import current_app, request
from flask_shop.models import User
from flask_shop.utils import message
import functools

# 生成token
def generate_auth_token(uid,expiration):
    # 创建加密对象
    #              密钥                             有效时期
    s = Serializer(current_app.config['SECRET_KEY'],expires_in=expiration)
    # 生成token
    #              给谁进行加密     格式
    return s.dumps({'id':uid}).decode('utf-8')

# 验证token
def verify_auth_token(token):
    # 生成解密对象
    # 同样可以用于解密token
    s = Serializer(current_app.config['SECRET_KEY'])
    # try:防止使用假token或者过期的token给出报错
    try:
        # 解密token,获取其中的数据
        data = s.loads(token)
    except Exception:
        return None
    # 获取用户的id
    usr = User.query.filter_by(id = data['id']).first()
    return usr

# 登录装饰器(验证用户是否登录)
def login_requed(view_func):
    @functools.wraps(view_func)
    def verify_token(*arg,**kwargs):
        # 先去请求头中找token,看看是否存在,为了避免不存在产生报错,使用try
        try:
            token = request.headers['token']
        except Exception:
            # 如果没有接收到token,给前端抛出错误,去message.py定义错误信息
            return message.to_dict_msg(10016)
        # 获取到token之后,去解密token
        # 创建解密对象
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token)
        except Exception:
            return message.to_dict_msg(10017)
        return view_func(*arg,**kwargs)
    return verify_token


4.调用装饰器

在view.py中

# 后端登录的实现
# 使用get请求不安全
@user.route('/login',methods=['POST'])
# 调用验证是否登录的装饰器
@login_requed()
def login():
    # 从前端输入框中获取,此时还没写前端使用postman测试
    name = request.form.get('name')
    pwd= request.form.get('pwd')
    # 判断两个是否为非空值
    if not all([name,pwd]):
        return {'status':10000,'msg':'数据不完整'}
    if len(name) > 1:
        # SQLALCHEMY查询语句:获取用户字段,得到实例对象
        usr = models.User.query.filter_by(name =name).first()
        if usr:
            # 调用usr视图中的验证蓝图
            if usr.check_password(pwd):
                # 登录成功生成token,实现免密登录
                token = generate_auth_token(usr.id,1000)
                # 用于验证token是否可以使用
                verify_auth_token(token)
                return to_dict_msg(200,data={'token':token})
    return {'status':10001,'msg':'用户名或密码错误'}#防止用户暴力测试

5.测试装饰器是否可用

先关闭掉登录装饰器,获取到一个token先
在这里插入图片描述
在这里插入图片描述

请求头中给一个token
在这里插入图片描述

测试结果发现:居然是token是不可使用的!无法解析出来!原因就在于我们每次
都重新启动了服务器,我们密钥的设置不是固定的,只要重启,密钥是会重新生成
的。这样就导致了我们解析方法的不同,token是无法识别的。
这个对于我们后续上线会影响嘛?其实并不会,我们上线后,不可能用户停止访问,我们就重启服务器吧,只要我们不重启服务器,密钥就不会改变。如果想测试,可以单独写一个路由,装饰器放在里面,看看是否可以使用

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值