使用 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 编写一个授权登录验证的模块的更多相关文章

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

    看一个关于授权登陆的简易模块,觉得挺不错,学习学习. 1.登录的逻辑:如果用户名和密码正确,就返回 token .2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时3.然后放在 ...

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

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

  3. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  4. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

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

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

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

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

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

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

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

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

  9. Python 编写一个有道翻译的 workflow 教程

    最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...

随机推荐

  1. c#将电脑时间同步到网络时间

    最近遇到个项目,需要控制软件使用时间,由于电脑不联网可以修改时间,故需要联网使电脑同步网络时间 网上寻找了很多解决方案,代码如下: //Forproc_Win32.cs//对常用Win32 API函数 ...

  2. liunx pyinotify的安装和使用

    介绍此功能是检测目录的操作的事件 1.安装 在百度云盘下载或者在gits上下载安装包 链接:https://pan.baidu.com/s/1Lqt872YEgEo_bNPEnEJMaw 提取码:bj ...

  3. 一个简单的例子学会github repository的webhook

    github的webhook是个有用的功能,允许开发人员指定一个服务器的url.当开发者对github仓库施加操作,比如提交代码,创建issue时,github网站会自动向该url指定的服务器推送事件 ...

  4. Notepad++快捷键及使用技巧

    常用快捷键: CTRL+Q 注释/取消注释 用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人....有木有简单的方法呢,确实还是有的不过也不算太好用.主 ...

  5. C# PDF 填值 填充数据

    看效果图   /// <summary> /// 赛事结果PDF /// </summary> /// <param name="model"> ...

  6. JS__POST

    RSA加密 熟悉的东西 public key Encrypt (函数) 而且 每次刷新都会变化() 一般 128 位,也有 256位的

  7. Flask+gevent-websocket模块实现websocket

    后端代码: from flask import Flask,request from geventwebsocket.handler import WebSocketHandler from geve ...

  8. python中的网络通信,socket、select、selectors、socketserver

    楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...

  9. WebApi接口测试工具

    原文出处: 懒得安分 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗. ...

  10. Ubuntu系统---FeiQ安装记录

    Ubuntu系统---FeiQ安装记录 linux下安装飞秋/飞鸽传书之类的软件iptux信使,可以与windows在一个局域网下聊天与传书文件,安装很简单. 首先,直接运行下面的语句即可:sudo ...