zoukankan      html  css  js  c++  java
  • JWT在flask中的demo

    JWT在flask中的demo

    • utils/jwt_auth
    import jwt
    import datetime
    from jwt import exceptions
    
    
    JWT_SALT = "FDAER#$$FGSIOD*DSF*)#*$$^ERFA"
    
    
    def create_token(payload,timeout=20):
        headers = {
            "typ":"jwt",
            "alg":"HS256",
        }
        payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)
        result = jwt.encode(payload=payload,key=JWT_SALT,algorithm="HS256",headers=headers).decode("utf-8")
        return result
    
    def parse_payload(token):
        result = {"status":False,"data":None,"error":None}
        try:
            verified_payload = jwt.decode(token,JWT_SALT,True)
            result['status'] = True
            result['data'] = verified_payload
        except exceptions.ExpiredSignatureError:
            result['error'] = "token已失效"
        except jwt.DecodeError:
            result['error'] = "token认证失败"
        except jwt.InvalidTokenError:
            result['error'] = "非法的token"
        return result
    
    
    • 视图中:
    from flask import Flask,request,jsonify,views,g
    from utils.jwt_auth import create_token,parse_payload
    
    app = Flask(__name__)
    
    @app.before_request
    def jwt_authorization_auth():
        """每次请求进入视图函数之前会执行此函数,验证token"""
        if request.path == '/login/':
            return
        authorization = request.headers.get('Authorization', '')
        print(authorization)
        auth = authorization.split()
        if not auth:
            return jsonify({'error': '未获取到Authorization请求头', 'status': False})
        if auth[0].lower() != 'jwt':
            return jsonify({'error': 'Authorization请求头中认证方式错误', 'status': False})
    
        if len(auth) == 1:
            return jsonify({'error': "非法Authorization请求头", 'status': False})
        elif len(auth) > 2:
            return jsonify({'error': "非法Authorization请求头", 'status': False})
    
        token = auth[1]
        result = parse_payload(token)
        if not result['status']:
            return jsonify(result)
        g.user_info = result['data']
    
    
    @app.route("/login/",methods=['POST'])
    def login():
        """登陆,密码正确返回token"""
        user = request.form.get("username")
        pwd = request.form.get("password")
        if user == "xjk" and pwd == "123":
            token = create_token({"username":"xjk"})
            return jsonify({"status":True,"token":token})
        return jsonify({"status":False,"error":"用户名密码错误"})
    
    
    @app.route('/order/',methods=['GET','POST','PUT','DELETE'])
    def order():
        """假设是个订单页面"""
        print(g.user_info)
        if request.method == "GET":
            return "订单列表"
        return "订单信息"
    if __name__ == '__main__':
        app.run(debug=True)
    
    
  • 相关阅读:
    导出htmlcleaner
    备份
    本地win7搭建SVN
    nutch 导入ecl
    linux 启动nutch
    c++中的构造函数前加上explicit
    string::erase的使用心得
    C++的static关键字(转载)
    Boot Trigger
    strtol()详解
  • 原文地址:https://www.cnblogs.com/xujunkai/p/12360077.html
Copyright © 2011-2022 走看看