• 使用 python 编写一个授权登录验证的模块


    使用 python 编写一个授权登录验证的模块

    我们编写的思路:
    1、登录的逻辑:如果用户名和密码正确,就返回 token 。
    2、生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时
    3、然后放在 users 中密码的后面,每次都不一样
    4、验证 token 的步骤,取出以后,解码
    得到用户名,去和 users 中的 token 比较,(只会和最近的 token 比较,之前的不比较,也就是之前的失效了)
    然后再验证是否过期。

    源代码:

    from flask import Flask, request, redirect
    
    import base64
    import random
    import time
    
    app = Flask(__name__)
    
    users = {
        "liwei": ["123456"],
        "zhouguang": ["888888"]
    }
    
    
    def getToken(uid):
        s1 = ':'.join([str(uid), str(random.random()), str(time.time() + 7200)])
        s2 = base64.b64encode(s1)
        users[uid].append(s2)
        print users[uid]
        return s2
    
    @app.route("/login", methods=['GET', 'POST'])
    def login():
        uid, pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')
    
        if users[uid][0] == pwd:
            return getToken(uid)
        else:
            return 'error'
        return 'OK'
    
    def verify_token(token):
        _token = base64.b64decode(token)
        if not users.get(_token.split(':')[0])[-1] == token:
            return -1
        if float(_token.split(':')[-1]) >= time.time():
            return 1
        else:
            return 0
    
    @app.route("/getResource", methods=['GET', 'POST'])
    def getResource():
        token = request.args.get('token')
        print token
        if verify_token(token) == 1:
            return 'data'
        else:
            return 'error'
    
    if __name__ == '__main__':
        app.run()
    

    关于源代码的说明:

    导入这三个模块 from 和 import 分别是什么意思呢?

    from flask import Flask, request, redirect
    
    import random
    import base64
    import time
    

    这句话比较重要,不要忘记了

    app = Flask(__name__)
    

    从请求头中获得数据应该这样写 [Authorization]

    authorization = request.headers['Authorization'];
    userAndPasswd = authorization.split(' ')[-1]
    print userAndPasswd
    
    user = base64.b64decode(userAndPasswd).split(":")[0]
    passwd = base64.b64decode(userAndPasswd).split(":")[1]
    

    键值对

    users ={
        "liwei":["123456"],
        "zhouguang":["888888"]
    }
    

    说明:获取的时候 users["liwei"]users.get("liwei") 都可以。

    留意下面这种写法,同时赋值

    uid,pwd = base64.b64decode(request.headers['Authorization'].split(' ')[-1]).split(':')
    

    元组后面添加元素

    users[uid].append(token)
    

    字符串连接的方法,时间类

    token = base64.b64encode(":".join([str(uid),str(random.random()),str(time.time() + 7200)]))
    

    写一个占位符 pass

    def verify_token(token):
        pass
    

    restful 风格的 url 这样写

    @app.route("/index/<user>", methods=['POST'])
    def hello_world(user):
        print('hello %s' % user)
        print request.headers
        return '%s ,welcome' % user
    

    重定向这样写,要记得引入 redirect 模块

    @app.route("/client/login", methods=['POST', 'GET'])
    def client_login():
        uri = 'http://localhost:5000/oauth'
        return redirect(uri)
    

    获得请求参数

    id = request.args.get('uid')
    
  • 相关阅读:
    kibana简单使用
    全文检索 高亮显示 数据库同步添加
    算法: Reverse Bits 反转位收藏
    算法:Number of 1 Bits 收藏
    JS创建二维数组
    查询状态在1,2,5,7的记录-oracle
    oracle 修改某字段,判断是否为空,如果为空赋默认值
    在运筹学中什么样的解决方案是最优的
    项目开发失败
    筛选符合条件的数据后,如何做数据源,绑定repeater
  • 原文地址:https://www.cnblogs.com/liweiwei1419/p/6792180.html
Copyright © 2020-2023  润新知