13.(后端)生成token并验证

1.生成和创建token

在flask_shop的工具类utils下创建一个新文件,专门用于生成和验证token信息。若对token不了解,可以查看第12篇文章
flask_shop/utils/tokens.py

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

# 签证序列化
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.get(data['id']).first()
    return usr

2.使用token

当用户登录第一次登录时候,为其创建一个token。由于我们的创建功能写在了view中,应该对应去他的文件中修改
# flask_shop/user/view.py

# flask_shop/user/view.py
# 此文件用于处理关于用户的业务逻辑,视图都写在这

# 导入用户的蓝图对象,这里的user不是文件,是在user.py定义好的蓝图对象
from flask import request
from flask_shop.user import user,user_api
from flask_shop import models,db
from flask_restful import Resource
import re
from flask_shop.utils.message import to_dict_msg
from flask_shop.utils.tokens import generate_auth_token
@user.route("/")
def index():
    return "Hello user"

# 用flask_restful实现注册功能
# 使用flask_restful 必须继承Resource类
class User(Resource):
    # get请求访问
    def get(self):
        pass
    # post请求访问    
    def post(self):
        name = request.form.get('name')
        pwd= request.form.get('pwd')
        real_pwd = request.form.get('real_pwd')
        nick_name = request.form.get('nick_name')
        phone = request.form.get('phone')
        email = request.form.get('email')
        # 验证数据的正确性
        if not all([name,pwd,real_pwd]):
            return to_dict_msg(10000)
        if len(name)<2:
            return to_dict_msg(10001)
        if len(pwd)<2:
            return to_dict_msg(10012)
        if pwd != real_pwd:
            return to_dict_msg(10013)
        # 正则表达式验证手机号和邮箱
        # ^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$
        if not re.match(r'^1[35789]\d{9}$',phone):
            return to_dict_msg(10014)
        if not re.match(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$',email):
            return to_dict_msg(10015)
        # 由于可能在数据库中会抛出异常,还是得做一个尝试
        try:
            # 提交数据
            # 注意这里的密码要加密处理,不可以直接返回给保存到数据库中得变量pwd,返回给函数password
            usr = models.User(name=name, password = pwd, nick_name = nick_name, phone = phone,
            email = email)
            db.session.add(usr)
            db.session.commit()
            return to_dict_msg(200)
        except Exception:
            return to_dict_msg(2000)

# flask_restful注册路由地址
user_api.add_resource(User,'/user')


# 后端登录的实现
# 使用get请求不安全
@user.route('/login',methods=['POST'])
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(user.id,1000)
                return to_dict_msg(200,data={'token':token})
    return {'status':10001,'msg':'用户名或密码错误'}#防止用户暴力测试

3.使用postman测试

3.1打一个断点

在这里插入图片描述

3.2发送post请求

在这里插入图片描述

3.3获取token

在这里插入图片描述

3.3 测试token是否可用

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

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

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

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

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

打赏作者

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

抵扣说明:

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

余额充值