如何为开玩笑的JWT设置请求的限制

时间:2019-12-13 00:51:04

标签: python flask jwt

我正在使用带有python,flask的API并通过超时来实现JWT,但我也想设置一个限制请求,因此如果超时或该令牌无效,则该令牌将无效已用于五个请求中。 我一直在使用到期超时,但是我找不到通过五个请求实现到期的方法。感谢您的帮助。

直到现在的代码:

from flask import *
import jwt
import datetime
from flask_pymongo import PyMongo
from functools import wraps
import hashlib

app = Flask(__name__)

app.config['MONGO_DBNAME'] = 'MONGOCONEX'
app.config['MONGO_URI'] = 'mongodb://localhost:27017/MONGOCONEX'
app.config['log_log_1'] = 'LOGKEYCONNECT'
app.config['key1'] = 'SECRECTKEY'
app.config['key2'] = 'PASSKEY'

mongo = PyMongo(app)

def token_required(f):
  @wraps(f)
  def decorated(*args, **kwargs):
    token = request.args.get('token') 
    if not token:
        return jsonify({'error': 402,'message':'Token is missing'})

    try:
        data = jwt.decode(token, app.config['key1'])
    except:
        return jsonify({'error': 403,'message': 'Token Invalid'})

    return f(*args, **kwargs)
  return decorated


@app.route('/results', methods=['GET'])
@token_required
def get_all_stars():
 results = mongo.db.resultados
 output = []
 date_start = datetime.datetime.now() - datetime.timedelta(days=1*365)
 date_end = datetime.datetime.now() + datetime.timedelta(days=1*365)
 for s in results.find():
  #print(s)
  if date_start <= s['day'] <= date_end:
    output.append({'day':s['day'], 'monthly_prediction':s['monthly_prediction'], 'percent_prediction':s['percent_prediction']})

 return jsonify({'result' : output})


@app.route('/login', methods=['GET'])
def login():
  log_key = request.args.get('l_k')
  password_k = request.args.get('p_k')

  md5_hash = hashlib.md5()
  md5_hash.update(b""+app.config['key2']+"")
  encoded_pass_key = md5_hash.hexdigest()

  if (log_key == app.config['log_log_1']) and (password_k == encoded_pass_key):
    token = jwt.encode({'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=2)}, app.config['key1'])

    return jsonify({'token': token.decode('UTF-8')})

  return jsonify({'error': 401, 'description': 'Not verified', 'Wrong Auth': 'Auth Required'})

if __name__ == '__main__':
try:
    app.run(debug=True)
except Exception as e:
    print('Error: '+str(e))

1 个答案:

答案 0 :(得分:0)

我看到您正在使用mongo,工作流程是您可以将计数器与mongo数据库中的令牌一起计数,并计算已使用的令牌数,然后添加逻辑以比较哪个先到,时间限制或如何令牌已使用了很多次,如果令牌已使用了五次,则可以撤消令牌并生成新令牌或要执行的其他工作流程。这是在令牌https://flask-jwt-extended.readthedocs.io/en/stable/blacklist_and_token_revoking/进入五次后撤消/将令牌列入黑名单的进一步参考