zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    request对象
    js基础3
    Andorid Binder进程间通信---总结
    java 获取系统变量(环境变量和设置变量)
    參加项目管理培训的一些体会
    select poll使用
    关注关注工作行列
    jquery——zTree, 完美好用的树插件
    OSI七层模型具体解释
    (原创)优酷androidclient 下载中 bug 解决
  • 原文地址:https://www.cnblogs.com/sdadx/p/10441687.html
Copyright © 2011-2022 走看看