美文网首页
前后端分离项目使用token登陆

前后端分离项目使用token登陆

作者: 独步江雪 | 来源:发表于2020-02-13 02:37 被阅读0次

前端代码


import importlib
import os
from flask import Flask, url_for, request, render_template



app = Flask(__name__)

app.jinja_env.auto_reload = True
app.config['TEMPLATES_AUTO_RELOAD'] = True


html = """
<html>

<body>
<div id="main-box"></div>
<script src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
<script>
function setCookie(name, value, days) { //设置cookie
    var d = new Date();
    d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
    var expires = "expires=" + d.toUTCString();
    document.cookie = name + "=" + value + "; " + expires;
}

</script>
<script>
//登陆按钮函数
function on_btn_login_clicked(event){
    var username = document.getElementById('input-username').value;
    var password = document.getElementById('input-password').value;
    $.ajax({
        url:'http://127.0.0.1:9999/account/login',
        type:'POST',
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true,
        contentType: "application/json;charset=utf-8",
        data:JSON.stringify({"username":username,"password":password}),
        dataType: "JSON",
        success:function(data){
            if(data.status_code==400){
                alert(data.status_msg)
            }else if(data.status_code==200){
                //登陆成功,将token存入cookie
                setCookie('token',data.token,7  )
            }
        },
        error:function(data){
            alert('请求失败');
        }
    })
    window.location.reload();

    
}


</script>


<script>
//token自动登陆

function verify_token(token){
    var res = false;
    $.ajax({
        async:false,//切换为同步请求的方式获取返回值
        url:'http://127.0.0.1:9999/account/verify_token',
        type:'POST',
        contentType: "application/json;charset=utf-8",
        data:JSON.stringify({"token":token}),
        dataType: "JSON",
        success:function(data){
            if(data.status_code==200){
                res= true;
            }else if(data.status_code==400){
                res= false;
            }
        },
        error:function(data){
            res= false;
        }
    })
    return res;
}


function get_token(){
    //cookie的格式 key1=value1;key2=value2...
    for (e of document.cookie.split(';')){
        var key = e.split('=')[0];
        var value = e.split('=')[1];
        if (key==='token'){
            return value;
        }
    }
    return null;
}
var main_box = document.getElementById('main-box')
var token = get_token();

if(token && verify_token(token)){
    //alert('登陆成功')
    //如果存在token,发送到服务器验证有效性,如果有效,显示登陆后的界面
    main_box.innerHTML = 'token is '+ token +',已登录';

}else{
    main_box.innerHTML = '<div>请登录</div><input type="text" id="input-username" placeholder="账号"><input type="text" id="input-password" placeholder="密码"><button onclick="on_btn_login_clicked(event)">登陆</button>';
}
</script>
</body>
</html>



"""

@app.route('/')
def index():
    return html



if __name__ == '__main__':
    app.run(port=9998)

后端代码

from flask import Flask, request, jsonify
from flask_cors import CORS  # 跨域请求插件 https://www.cnblogs.com/cwp-bg/p/9256892.html

app = Flask(__name__)
CORS(app, supports_credentials=True)  # 允许跨域请求

app.jinja_env.auto_reload = True
app.config['TEMPLATES_AUTO_RELOAD'] = True

account_db = {
    'test': '123456',
}
redis = {}


@app.after_request
def after_request(response_):
    """
    #请求钩子,在所有的请求发生后执行,加入headers。
    :param response_:
    :return:
    """
    # response_ = make_response(response_)
    response_.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:9998'  # 设置为'*'浏览器将不会发送cookies数据
    response_.headers['Access-Control-Allow-Methods'] = 'GET,POST'
    response_.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
    response_.headers['Access-Control-Allow-Credentials'] = 'true'  # 是否允许后续请求携带认证信息(cookies)

    # print(response_.__class__)
    return response_


def is_valid_account(username, password):
    return username in account_db and account_db[username] == password


def is_valid_token(token):
    username = token[:-16]
    return username in redis and redis[username] == token


def make_token(username):
    # 加密后的token,包含用户名信息,每次登陆都会更新token
    return username + 'suijizifuchuan16'


def save_token_to_redis(username, token):
    redis[username] = token


@app.route('/account/login', methods=['POST'])
def account_login():
    # 验证账号密码
    # print(request.cookies) #测试获取cookies
    data = request.json
    username = data['username']
    password = data['password']

    if is_valid_account(username, password):
        token = make_token(username)  # 每次登陆都会更新token
        save_token_to_redis(username, token)

        return jsonify({'status_code': 200, 'status_msg': '登陆成功', 'token': token})
    else:
        return jsonify({'status_code': 400, 'status_msg': '登陆失败'})


@app.route('/account/verify_token', methods=['POST'])
def verify_token():
    data = request.json
    token = data['token']
    if is_valid_token(token):
        # 延长token有效期
        return jsonify({'status_code': 200, 'status_msg': 'token有效'})
    else:
        return jsonify({'status_code': 400, 'status_msg': 'token无效'})


if __name__ == '__main__':
    app.run(port=9999)


相关文章

网友评论

      本文标题:前后端分离项目使用token登陆

      本文链接:https://www.haomeiwen.com/subject/cazhfhtx.html