看一个关于授权登陆的简易模块,觉得挺不错,学习学习。
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进行转换。
参考: