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":["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

https://blog.csdn.net/tclzsn7456/article/details/79550249

原文地址:https://www.cnblogs.com/sdadx/p/10441687.html