zoukankan      html  css  js  c++  java
  • Flask 编写一个授权登录验证的模块(一)

    看一个关于授权登陆的简易模块,觉得挺不错,学习学习。

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

    app.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #python3
    
    import base64
    import random
    import time
    import json
    
    from flask import Flask, request
    
    app = Flask(__name__)
    
    users = {
        "zs":["123456"]
    }
    
    # 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
    
    # 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,pwd=base64.b64decode(request.headers['Authorization'].split(' ')[-1]).decode('utf-8').split(':')
        if users.get(uid)[0]==pwd:
            return gen_token(uid)
        else:
            return 'error'
    
    
    @app.route('/test', 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)

    运行app.py,之后客户端进行请求。

    ①先登陆请求login,运行下面代码,之后token会被打印出来

    import requests
    
    r=requests.get('http://127.0.0.1:5000/login',auth=('zs','123456'))
    print(r.text)

    ②向test方法发送请求,将token带入。

    token='enM6MC4zODg0NzA4MzgzMDQyNjg3NjoxNTYwNjgzNTYzLjAyNjM3Nw=='
    r=requests.get('http://127.0.0.1:5000/test',params={'token':token})
    print(r.text)

    注意:

    1.如果登陆很多次,每次打印的token都是新的,最新的有效。验证方法里是从user的最后边开始取。

    2.本示例用python3改写,python3中base64加密解密,很多地方需要对str和byte进行转换。

    参考:

    https://www.cnblogs.com/liweiwei1419/p/6792180.html

    https://www.bilibili.com/video/av9527381/?p=7

  • 相关阅读:
    ansible笔记(11):初识ansible playbook(二)
    Linux下查看占用CPU与内存最高的进程
    ansible笔记(10):初识ansible playbook
    AbpZero Http 模式下 Chrome浏览器因Cookie 不能登录
    Tomcat 8443&8080 并存
    接入腾讯cos文件存储
    安卓包打渠道标签
    java Android与PHP encode的区别
    thinkphp常用
    phalcon task任务
  • 原文地址:https://www.cnblogs.com/sdadx/p/10390969.html
Copyright © 2011-2022 走看看