使用 python 编写一个授权登录验证的模块
使用 python 编写一个授权登录验证的模块
我们编写的思路:
1、登录的逻辑:如果用户名和密码正确,就返回 token 。
2、生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时
3、然后放在 users 中密码的后面,每次都不一样
4、验证 token 的步骤,取出以后,解码
得到用户名,去和 users 中的 token 比较,(只会和最近的 token 比较,之前的不比较,也就是之前的失效了)
然后再验证是否过期。
源代码:
from flask import Flask, request, redirect
import base64
import random
import time
app = Flask(__name__)
users = {
"liwei": ["123456"],
"zhouguang": ["888888"]
}
def getToken(uid):
s1 = ':'.join([str(uid), str(random.random()), str(time.time() + 7200)])
s2 = base64.b64encode(s1)
users[uid].append(s2)
print users[uid]
return s2
@app.route("/login", methods=['GET', 'POST'])
def login():
uid, pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')
if users[uid][0] == pwd:
return getToken(uid)
else:
return 'error'
return 'OK'
def verify_token(token):
_token = base64.b64decode(token)
if not users.get(_token.split(':')[0])[-1] == token:
return -1
if float(_token.split(':')[-1]) >= time.time():
return 1
else:
return 0
@app.route("/getResource", methods=['GET', 'POST'])
def getResource():
token = request.args.get('token')
print token
if verify_token(token) == 1:
return 'data'
else:
return 'error'
if __name__ == '__main__':
app.run()
关于源代码的说明:
导入这三个模块 from 和 import 分别是什么意思呢?
from flask import Flask, request, redirect
import random
import base64
import time
这句话比较重要,不要忘记了
app = Flask(__name__)
从请求头中获得数据应该这样写 [Authorization]
authorization = request.headers['Authorization'];
userAndPasswd = authorization.split(' ')[-1]
print userAndPasswd
user = base64.b64decode(userAndPasswd).split(":")[0]
passwd = base64.b64decode(userAndPasswd).split(":")[1]
键值对
users ={
"liwei":["123456"],
"zhouguang":["888888"]
}
说明:获取的时候 users["liwei"] 和 users.get("liwei") 都可以。
留意下面这种写法,同时赋值
uid,pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')
元组后面添加元素
users[uid].append(token)
字符串连接的方法,时间类
token = base64.b64encode(":".join([str(uid),str(random.random()),str(time.time() + 7200)]))
写一个占位符 pass
def verify_token(token):
pass
restful 风格的 url 这样写
@app.route("/index/<user>", methods=['POST'])
def hello_world(user):
print('hello %s' % user)
print request.headers
return '%s ,welcome' % user
重定向这样写,要记得引入 redirect 模块
@app.route("/client/login", methods=['POST', 'GET'])
def client_login():
uri = 'http://localhost:5000/oauth'
return redirect(uri)
获得请求参数
id = request.args.get('uid')
使用 python 编写一个授权登录验证的模块的更多相关文章
- Flask 编写一个授权登录验证的模块(一)
看一个关于授权登陆的简易模块,觉得挺不错,学习学习. 1.登录的逻辑:如果用户名和密码正确,就返回 token .2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时3.然后放在 ...
- Flask 编写一个授权登录验证的模块(二)
本篇比上一篇多了重定向的功能 #!/usr/bin/env python # -*- coding: utf-8 -*- #python3 import base64 import random im ...
- 练习:python 操作Mysql 实现登录验证 用户权限管理
python 操作Mysql 实现登录验证 用户权限管理
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 在phpWeChat中如何定义一个授权登录(获取昵称)的链接
在phpWeChat中如何定义一个授权登录(获取昵称)的超链接?使其点击后出现如下效果? 由于集成了这个功能,其实这个需要是很简单的. 假如您想在授权后跳转到http://www.baidu.com/ ...
- MFC+WinPcap编写一个嗅探器之五(过滤模块)
这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...
- MFC+WinPcap编写一个嗅探器之四(获取模块)
这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...
- MFC+WinPcap编写一个嗅探器之六(分析模块)
这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...
- Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...
随机推荐
- empty和isset的区别
1.empty 判断一个变量是否为空 null.false.0.0.0.’0′.array() .' '.var $a 都会返回true. 2.isset 判断一个变量是否设置 0.00.’0′. ...
- nexus 绑定负载均衡nginx反向代理后 遇到的https问题。
1.今天搭建maven私服,下载安装好nexus运行后,通过IP可以直接访问,没有问题,如:http://123.123.123.123:8081 就可以进入主页面.没有任何问题. 2.但是他默认是h ...
- 日志实时收集之FileBeat+Kafka
之前,我们的某一个业务用于实时日志收集处理的架构大概是这样的: 在日志的产生端(LogServer服务器),都部署了FlumeAgent,实时监控产生的日志,然后发送至Kafka.经过观察,每一个 ...
- TensorFlow C++接口编译和使用
部分内容from: Tensorflow C++ 从训练到部署(1):环境搭建 在之前的编译中,已经编译好了tensorflow_pkg相关的wheel.现在有一个需求,需要按照C++的代码进行模型加 ...
- Notepad++快捷键及使用技巧
常用快捷键: CTRL+Q 注释/取消注释 用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人....有木有简单的方法呢,确实还是有的不过也不算太好用.主 ...
- RobHess的SIFT代码解析步骤三
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- linux物理地址和虚拟地址
- 【异常】ERROR main:com.cloudera.enterprise.dbutil.SqlFileRunner: Exception while executing ddl scripts. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'ROLES' already exists
1 详细异常 2019-10-11 10:33:55,865 INFO main:com.cloudera.server.cmf.Main: ============================= ...
- 《Linux就该这么学》day4-6
继续学习打卡,这几天有事所以看视频补上了这几天的学习进度. day4:主要重点 tar打包和解压命令 tar -zxvf xxx.tar.gz 解压xxx.tar.gz (将xxx.tar.gz ...
- ASP.config配置
使用ASP.NET搭建三层时候, 有Model (模型)DAL(数据访问层) BLL(业务逻辑层) 连接数据库的DBhelper 放在DAL层 假如 你数据库密码改了,你要打开VS 找到DBh ...