Flask 编写一个授权登录验证的模块(二)
本篇比上一篇多了重定向的功能
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#python3 import base64
import random
import time
import json from flask import Flask, request, redirect app = Flask(__name__) users = {
"zs":[""]
}
redirect_uri='http://localhost:5000/client/passport'
client_id = '' users[client_id] = [] auth_code = {}
oauth_redirect_uri = [] # 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 def gen_auth_code(uri):
code = random.randint(0,10000)
auth_code[code] = uri
return code # 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, pw = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).decode('utf-8').split(':')
if users.get(uid)[0] == pw:
return gen_token(uid)
else:
return 'error' @app.route('/oauth', methods=['POST', 'GET'])
def oauth():
if request.args.get('user'):
if users.get(request.args.get('user'))[0] == request.args.get('pw') and oauth_redirect_uri:
uri = oauth_redirect_uri[0] + '?code=%s' % gen_auth_code(oauth_redirect_uri[0])
return redirect(uri)
if request.args.get('code'):
if auth_code.get(int(request.args.get('code'))) == request.args.get('redirect_uri'):
return gen_token(request.args.get('client_id'))
if request.args.get('redirect_uri'):
oauth_redirect_uri.append(request.args.get('redirect_uri'))
return 'please login' @app.route('/client/login', methods=['POST', 'GET'])
def client_login():
uri = 'http://localhost:5000/oauth?response_type=code&client_id=%s&redirect_uri=%s' % (client_id, redirect_uri)
return redirect(uri) @app.route('/client/passport', methods=['POST', 'GET'])
def client_passport():
code = request.args.get('code')
uri = 'http://localhost:5000/oauth?grant_type=authorization_code&code=%s&redirect_uri=%s&client_id=%s' % (code, redirect_uri, client_id)
return redirect(uri) @app.route('/test1', 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)
测试代码
import requests
r = requests.get('http://127.0.0.1:5000/client/login')
print (r.text)
print (r.history)
print (r.url)
login_uri = r.url.split('?')[0] + '?user=zs&pw=123456'
r2 = requests.get(login_uri)
print (r2.text)
print (r2.history)
r = requests.get('http://127.0.0.1:5000/test1', params={'token': r2.text})
print (r.text)
结果
please login
[<Response [302]>]
http://localhost:5000/oauth?response_type=code&client_id=12345678&redirect_uri=http://localhost:5000/client/passport
MTIzNDU2Nzg6MC43MTQzMTI4MjA2ODQ5MjUyOjE1NjQzMzE3NzQuOTUyMjYyOQ==
[<Response [302]>, <Response [302]>]
data
参考:https://blog.csdn.net/liuchunming033/article/details/45564791
https://blog.csdn.net/tclzsn7456/article/details/79550249
Flask 编写一个授权登录验证的模块(二)的更多相关文章
- Flask 编写一个授权登录验证的模块(一)
看一个关于授权登陆的简易模块,觉得挺不错,学习学习. 1.登录的逻辑:如果用户名和密码正确,就返回 token .2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时3.然后放在 ...
- 使用 python 编写一个授权登录验证的模块
使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...
- MFC+WinPcap编写一个嗅探器之五(过滤模块)
这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...
- MFC+WinPcap编写一个嗅探器之四(获取模块)
这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...
- 在phpWeChat中如何定义一个授权登录(获取昵称)的链接
在phpWeChat中如何定义一个授权登录(获取昵称)的超链接?使其点击后出现如下效果? 由于集成了这个功能,其实这个需要是很简单的. 假如您想在授权后跳转到http://www.baidu.com/ ...
- 如何编写一个简单的Linux驱动(二)——完善设备驱动
前期知识 1.如何编写一个简单的Linux驱动(一)——驱动的基本框架 2.如何编写一个简单的Linux驱动(二)——设备操作集file_operations 前言 在上一篇文章中,我们编写设备驱动遇 ...
- MFC+WinPcap编写一个嗅探器之六(分析模块)
这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...
- 如何编写一个简单的Linux驱动(二)——设备操作集file_operations
前期知识 如何编写一个简单的Linux驱动(一)--驱动的基本框架 前言 在上一篇文章中,我们学习了驱动的基本框架.这一章,我们会在上一章代码的基础上,继续对驱动的框架进行完善.要下载上一篇文章的全部 ...
- Python爬虫之编写一个可复用的下载模块
看用python写网络爬虫第一课之编写可复用的下载模块的视频,发现和<用Python写网络爬虫>一书很像,写了点笔记: #-*-coding:utf-8-*- import urllib2 ...
随机推荐
- docker系列五之数据卷(volumn)
docker数据卷(volumn) 一. 为什么需要数据卷 docker镜像是由多个文件系统(只读层)叠加而成,当我们启动一个容器的时候,docker的服务端会加载镜像的只读层,并在最顶层创建一个可读 ...
- 微信小程序tabBar与redirectTo 或navigateTo冲突
微信小程序tabBar与redirectTo 或navigateTo冲突 tabBar设置的pagePath无法再次被redirectTo或navigateTo引用 导致跳转失败,更改为swithTa ...
- OGG 自动重启脚本
6-20 * * * /oggdata/log/oggautorestart.sh >/oggdata/log/crontab_oggautorestart.log 2>&1 [说 ...
- Proxy ARP
翻译自:https://ccieblog.co.uk/arp/proxy-arp Proxy ARP在一些路由器上是默认开启的.其思想是使两个不同子网上的主机,在没有配置默认网关的情况下,实现彼此通信 ...
- mysql 创建用户并授权数据库
create user test identified by ‘password’:password 你要创建的用户对应的密码 grant all on database.* to test; ...
- Paper Reading:Faster RCNN
Faster R-CNN 论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 发表时间: ...
- MySQL进阶8 分页查询(limit) - 【SQL查询语法执行顺序及大致结构】- 子查询的3个经典案例
#进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 ...
- [转载]es6 Promise.resolve()方法
es6 Promise.resolve()方法 2018-01-27 22:29:06 ixygj197875 阅读数 16925更多 分类专栏: ES6标准入门 (阮一峰) ES6标准入门 Pr ...
- react-router和react-router-dom的区别
RR4 本次采用单代码仓库模型架构(monorepo),这意味者这个仓库里面有若干相互独立的包,分别是: react-router React Router 核心 react-router-dom 用 ...
- 一致性Hash算法(转载)
原文地址http://blog.csdn.net/caigen1988/article/details/7708806 consistent hashing 算法早在 1997 年就在论文 Con ...