Я создаю облачный сервис, и мне нужно знать одну вещь. Это мой третий день с использованием flask и JWT, так что в основном мне нужно каким-то образом увидеть, вошел ли пользователь в систему. Итак, я сейчас выполнил вход в систему, которая генерирует токен аутентификации JWT, внутри которого хешируется информация о пользователе. Это. На данный момент, после входа в систему, я сгенерировал токен и сохранил его в куки, и теперь у меня есть одна вещь, которую пользователь может снова войти в систему, когда он вошел в систему, и система сгенерировала еще один токен JWT. Поэтому теперь мне нужно создать сеанс, который сохраняет статус сеанса пользователя, например - logged in = True
, и сеанс автоматически закрывается, когда истекает токен JWT, я пытался сделать это, но является ли это хорошим примером этого? А вот и мой код.
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = None
if 'x-access-token' in request.cookies:
token = request.cookies['x-access-token']
else:
return jsonify({'message': 'Token is missing'}), 401
try:
data = jwt.decode(token, app.config['SECRET_KEY'])
current_user = User.query.filter_by(public_id=data['public_id']).first()
except jwt.DecodeError:
print('decodeerrr')
return jsonify({'message': 'Token is missing'}), 401
except jwt.exceptions.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
return f(current_user, *args, **kwargs)
return decorated
@app.route('/login')
def login():
if 'x-access-token' in request.cookies:
token = request.cookies['x-access-token']
try:
data = jwt.decode(token, app.config['SECRET_KEY'])
return jsonify({'message': 'User is already logged in cant perform another login'}), 200
except jwt.DecodeError:
print('decodeerrr')
return jsonify({'message': 'Token is missing'}), 401
except jwt.exceptions.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
else:
pass
auth = request.authorization
if not auth or not auth.username or not auth.password:
return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm="Login required!"'})
user = User.query.filter_by(username=auth.username).first()
if not user:
return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm="Login required!"'})
if check_password_hash(user.password, auth.password):
token = jwt.encode({'public_id': user.public_id, 'exp': datetime.datetime.now() + datetime.timedelta(minutes=30)}, app.config['SECRET_KEY'])
print("++++++++++++++++++++++ ANOTHER LOGIN +++++++++++++++++++++++")
resp = make_response(f'Successfully Logged in as {user.username}', 200)
resp.set_cookie('x-access-token', token.decode('UTF-8'), expires=datetime.datetime.utcnow() + datetime.timedelta(seconds=15))
return resp
#return jsonify({'token': token.decode('UTF-8')})
#resp = make_response("hello") #here you could use make_response(render_template(...)) too
#resp.headers['x-access-token'] = token.decode('UTF-8')
#return resp
return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm="Login required!"'})