Flask 编写一个授权登录验证的模块(一)

看一个关于授权登陆的简易模块,觉得挺不错,学习学习。

1、登录的逻辑:如果用户名和密码正确,就返回 token 。
2、生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时
3、然后放在 users 中密码的后面,每次都不一样
4、验证 token 的步骤,取出以后,解码
得到用户名,去和 users 中的 token 比较,(只会和最近的 token 比较,之前的不比较,也就是之前的失效了)
然后再验证是否过期。

app.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#python3

import base64
import random
import time
import json

from flask import Flask, request

app = Flask(__name__)

users = {
    "zs":["123456"]
}

# token生成器
def gen_token(uid):
    #生产token,将token放到users后边
    token=base64.b64encode(':'.join([str(uid),str(random.random()),str(time.time()+7200)]).encode('utf-8'))
    users[uid].append(token.decode('utf-8'))
    return token

# token验证
def verify_token(token):
    #token先解密,拿到用户名,去users中查找,比较两个token是否一致。
    _token=base64.b64decode(token).decode('utf-8')
    if not users.get(_token.split(':')[0])[-1] == token:
        return -1
    #如果两个token一致,再看看时间,是否过期
    if float(_token.split(':')[-1])>=time.time():
        return 1
    else:
        return 0



# 验证服务器端
@app.route('/index', methods=['POST', 'GET'])
def index():
    print(request.headers)
    return 'hello'

@app.route('/login', methods=['POST', 'GET'])
def login():
    uid,pwd=base64.b64decode(request.headers['Authorization'].split(' ')[-1]).decode('utf-8').split(':')
    if users.get(uid)[0]==pwd:
        return gen_token(uid)
    else:
        return 'error'


@app.route('/test', methods=['POST', 'GET'])
def test():
    token=request.args.get('token')
    if verify_token(token)==1:
        return 'data'
    else:
        return 'error'

if __name__ == '__main__':
    app.run(debug=True)

运行app.py,之后客户端进行请求。

①先登陆请求login,运行下面代码,之后token会被打印出来

import requests

r=requests.get('http://127.0.0.1:5000/login',auth=('zs','123456'))
print(r.text)

②向test方法发送请求,将token带入。

token='enM6MC4zODg0NzA4MzgzMDQyNjg3NjoxNTYwNjgzNTYzLjAyNjM3Nw=='
r=requests.get('http://127.0.0.1:5000/test',params={'token':token})
print(r.text)

注意:

1.如果登陆很多次,每次打印的token都是新的,最新的有效。验证方法里是从user的最后边开始取。

2.本示例用python3改写,python3中base64加密解密,很多地方需要对str和byte进行转换。

参考:

https://www.cnblogs.com/liweiwei1419/p/6792180.html

https://www.bilibili.com/video/av9527381/?p=7

原文地址:https://www.cnblogs.com/sdadx/p/10390969.html