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 ...
随机推荐
- JavaScript Drum kit
用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在.我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明. ...
- Go微服务 grpc/protobuf
了解grpc/protobuf gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers ...
- Go 信道Channel
信道(Channel) 信道(Channel)可以被认为是协程之间通信的管道.数据可以从信道的一端发送并在另一端接收. 默认为同步模式,需要发送和接收配对.否则会被阻塞,直到另外的信道准备好后被唤醒. ...
- redis修改大key报Argument list too long的解决办法:
线上一个业务出现异常:redis的一个大大大大大key数据有问题,所以导出修改再导入,但遇到了问题: [root@ ~]# /usr/local/redis/bin/redis-cli -h 127. ...
- python的set集合去重功能
# -*- coding:utf-8 -*- setData=set([]) #第一种方式,通过add()添加元素 setData.add('china\n') setData.add('turky\ ...
- markdown在typora的超方便的应用
经常性需要进行文字的编写,但是使用word比较麻烦,而excel又不方便自己的工作实际实用,特此有一款软件支持我的应用,typora软件,让人使用的无法自拨. typora是基于markdown的来应 ...
- 扩展的KMP算法图解
扩展的KMP算法,可以在Ο(n + m)的时间复杂度内计算出模板串与文本串的每一个后缀的最长公共前缀,即LCP(T[i:n],P). KMP算法所解决的单模板字符串匹配问题,求得的匹配点是LCP = ...
- linux服务器管理
1.找出目前系统开启的网络服务有哪些? netstat -tulp 2.找出所有的有监听网络的服务(包含socket状态) Netstat -lnp 3.查看所有的服务状态 Service –-sta ...
- Reservoir Sampling 蓄水池采样算法
https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d htt ...
- 0001SpringBoot整合Mybatis
SpringBoot整合Mybatis主要分为以下几个步骤: 1.添加Mybatis的起步依赖(pom.xml) 2.添加数据库驱动坐标(pom.xml) 3.添加数据库连接信息(applicatio ...