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

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":[""]
} # 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',''))
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

Flask 编写一个授权登录验证的模块(一)的更多相关文章

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

    本篇比上一篇多了重定向的功能 #!/usr/bin/env python # -*- coding: utf-8 -*- #python3 import base64 import random im ...

  2. 使用 python 编写一个授权登录验证的模块

    使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...

  3. MFC+WinPcap编写一个嗅探器之五(过滤模块)

    这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...

  4. MFC+WinPcap编写一个嗅探器之四(获取模块)

    这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...

  5. 在phpWeChat中如何定义一个授权登录(获取昵称)的链接

    在phpWeChat中如何定义一个授权登录(获取昵称)的超链接?使其点击后出现如下效果? 由于集成了这个功能,其实这个需要是很简单的. 假如您想在授权后跳转到http://www.baidu.com/ ...

  6. MFC+WinPcap编写一个嗅探器之六(分析模块)

    这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...

  7. Python爬虫之编写一个可复用的下载模块

    看用python写网络爬虫第一课之编写可复用的下载模块的视频,发现和<用Python写网络爬虫>一书很像,写了点笔记: #-*-coding:utf-8-*- import urllib2 ...

  8. 用flask实现一个用户登录的功能

    #!/usr/bin/python #coding=utf-8 from flask import Flask,session,redirect,url_for,request app=Flask(_ ...

  9. 使用React写的一个小小的登录验证密码组件

    哎,算了.直接上代码吧,不懂得私聊我把 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

随机推荐

  1. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16944839 > 16777216). You can change this value on the server by setting the max_allowed_packet' variable.

    今天发现task微服务的error日志报如下错误: Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large ...

  2. JS错误信息类型

    1.SyntaxError 语法错误 ①变量名不规范 // 变量名不规范 var 1 = 1; 未被捕获的语法错误,这个错误是js机制自动抛出来的 意外的数字 // 下面两个是同一种情况 var 1a ...

  3. js入门之函数

    一. 函数 函数可以封装一段特定功能的代码,然后通过函数名可以重复调用 1 .函数的定义 funcation 函数名 (){ 函数体 } 函数名() 调用函数 2. 函数的参数 funcation f ...

  4. 基2时抽8点FFT的matlab实现流程及FFT的内部机理

    前言 本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好, 还是老实调IP吧,了解内部机理即可,无需重复发明轮子. 参考 https:// ...

  5. 2019年6月SAP发布的未来ABAP平台的发展方向

    未来ABAP平台将始终是这些产品的技术平台: S/4HANA On-Premises和Cloud将基于一个统一的ABAP codeline: SAP云平台上的ABAP编程环境: 什么是SAP Clou ...

  6. Redis二进制安全概念

    二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改.破译等,如果被攻击,能够及时检测出来. 二进制安全包含了密码学的一些东西,比如加解密.签名等. 举个例子,你把数据1111000 ...

  7. linux 基础8-shell script

    1. 什么是shell script 1.1 介绍: 什么是 shell script (程序化脚本) 呢?就字面上的意义,我们将他分为两部份. 在『 shell 』部分,我们在bash当中已经提过了 ...

  8. (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结

    1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...

  9. LeetCode--字符串

    1.给定字符串s,分区s使得分区的每个子字符串都是回文. 返回s的所有可能的回文分区.例如,给定s =“aab”,返回 [ ["aa","b"], [" ...

  10. Nginx系列1.1:ubuntu16.04编译nginx-rtmp流媒体服务器

    1.下载nginx和nginx-rtmp-module nginx官网:nginx.org tar.gz文件 解压缩命令: wget https://nginx.org/download/nginx- ...