本篇比上一篇多了重定向的功能
#!/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":["123456"] } redirect_uri='http://localhost:5000/client/passport' client_id = '12345678' 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