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

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. edk2中子目录介绍

    edk2中子目录介绍 来源 https://blog.csdn.net/rikeyone/article/details/80760204 参考:https://github.com/tianocor ...

  2. opencv 加载pb

    1.错误1         Tensor's data type is not supported the type of Mul  is DF_Float 2.  错误2 type == " ...

  3. POJ2945(Find the Clones)--字典树,map

    题意:给你n个规定长度的单词,问你其中出现了1次的单词,出现两次的单词...出现n次单词分别有多少个. 当然这题map也能过,但是这里介绍字典树的做法. 首相对于n个单词存入树中,当然建树过程中遇到一 ...

  4. 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

  5. Go 缓冲信道

    缓冲信道 语法结构:cap为容量 ch := make(chan type, cap) 缓冲信道支持len()和cap(). 只能向缓冲信道发送容量以内的数据. 只能接收缓冲信道长度以内的数据. 缓冲 ...

  6. openssl/opensslv.h错误的解决方案

    sudo apt install libssl-dev  

  7. 一个异常研究InvalidApartmentStateChange

    微软资料:invalidApartmentStateChange MDA 地址:https://docs.microsoft.com/zh-cn/dotnet/framework/debug-trac ...

  8. linux加载字体

    将解压后的文件夹cp到/usr/share/fonts目录下,然后cd到/usr/share/fonts/ziti目录下执行:mkfontscalemkfontdirfc-cache 在linux,把 ...

  9. Controllers返回View的一个完整流程

    详细说明一个MVC框架下,返回一个view的原理.如下图: 上图粗略的说明了一个返回View的流程,细节如下: 1.定义Model类: 2.定义接口添加接口约束为class: 3.定义接口实现类,即对 ...

  10. 0008SpringBoot中的spring.config.location对于运维的用处

    在工作过程中,若项目已经打好包,application.properties中的配置文件已经不能修改,但是还是需要修改一些参数或者新增一些参数的情况下怎么办? 可以单独再定义一个配置文件,比如定义名称 ...