Flask学习-4-server对象(token)

  1. 数据加密-sha1

     import hashlib
     pwd='a123456'
     temp=hashlib.sha1(pwd.encode())
     print(temp.hexdigest())
    
  2. hash加盐加密

    from werkzeug.security import generate_password_hash,check_password_hash
    
    def password_hash(str):
        method = 'pbkdf2:sha1:2000'
        salt_length = 8
        str_encode = generate_password_hash(str, method=method, salt_length=salt_length)
        return str_encode
    
    def check_password(old_str_hash, new_str):
        res = check_password_hash(old_str_hash, new_str)
        return res
    
    if __name__ == '__main__':
        encodestr = password_hash('123')
        print(encodestr)
        print(check_password(encodestr, '123'))
    
  3. JWT基础

    JWT(Json web token) 是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519)
    流程:

    1. 用户使用用户名、密码请求服务器
    2. 服务器验证用户信息
    3. 服务器通过验证发送给用户一个token
    4. 客户端存储token,并在每次请求时附加这个token值
    5. 服务器验证token,并返回数据,这个token必须要在每次请求时发送给服务器,它应该保存在请求头中,另外,服务器要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了 Access-Control-Allow-Origin:*
    

    JWT字符串组成:头部(headers) . 载荷(payload) . 签证(signature) 【头部保存声明信息,base64加密;载荷保存有效信息option,base64加密;签证由加密后的headers、加密后的payload、secret组成,然后加密】

  4. 安装

    pip install pyjwt -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  5. 封装token的生成和验证

    service / utils / token_tool.py

    import jwt
    from datetime import datetime,timedelta
    
    # 私钥
    SECRET_KEY = '2019-8-9'
    # 过期时间
    EXPIRE = 180
    
    def make_token(id):
        datetimeInt = datetime.utcnow() + timedelta(seconds=EXPIRE)
        # 载荷
        option = {
            "iss": "test.com",  # token签发者
            "exp": datetimeInt,  # 过期时间
            "iat": datetime.utcnow(),
            "aud": "webkit",
            "id": id
        }
        token = jwt.encode(option, SECRET_KEY, 'HS256')
        return token
    
    def check_token(token):
        id = None
        try:
            decoded = jwt.decode(token, SECRET_KEY, audience='webkit', algorithms=['HS256'])
            id = decoded.get('id')
        except jwt.ExpiredSignatureError as ese:
            print(ese)
        except Exception as ex:
            print(ex)
        finally:
            return id
    
  6. 利用token_tool.py对用户进行验证

    service/user_service.py : login时调用make_token进行token的生成;show时利用装饰器调用check_token进行token的验证

    @user.route('/login/', methods = ['GET', "POST"])
    def login():
        if request.method == 'GET':
            return 'get...login...'
        else:
            user = request.get_json()
            if user.get('telephone') == '15712345678':
                if user.get('password') == '123456':
                    token = make_token(user.get('telephone'))
                    return status_code["login_success"],200,{"token":token}
                else:
                    return status_code["password_error"]
            else:
                return status_code["user_none"]
    
    
    
    @user.route('/show/')
    @check_login
    def show():
        uid = request.args.get('id')
        return '欢迎{}用户登录成功'.format(uid)
    

    service/decorate/check_user.py :成功则返回,失败则跳转

    from functools import wraps
    from flask import request,redirect
    from app.service.utils.token_tool import check_token
    
    def check_login(func):
        @wraps(func)
        def wrapper():
            print('check..is..ok...')
            token = request.headers.get('token')
            id = check_token(token)
            # print(id)
            if id:
                return func()
            else:
                return redirect('/user/login/')
        return wrapper
    

你可能感兴趣的:(Flask,Flask)