Токены нужно передавать с клиента в заголовках, а на сервере использовать валидацию для роутов, например с
flask-jwt-extended
Минимально рабочий вариант:
from flask import Flask, request, jsonify
from flask_jwt_extended import (
JWTManager,
create_access_token,
jwt_required,
get_jwt_identity
)
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super-secret'
app.config['JWT_SECRET_KEY'] = app.config['SECRET_KEY']
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = False
jwt = JWTManager(app)
users = ['kshnkvn']
@app.route('/login', methods=['POST'])
def login():
user = request.json.get('user')
if user not in users:
return jsonify(
{'status': False, 'result': 'User not exists'})
else:
return jsonify(
{'status': True, 'result': create_access_token(identity=user)})
@app.route('/user', methods=['GET'])
@jwt_required
def user():
user = get_jwt_identity()
return jsonify({'status': True, 'result': user})
if __name__ == '__main__':
app.run(debug=True, port=6061)
В итоге если шлем запрос на
/user
без заголовка с авторизацией, то получаем в ответ:
{
"msg": "Missing Authorization Header"
}
Для получения токена отправляем
POST
запрос на
/login
где в теле запроса отправляем
JSON
с именем пользователя, а в ответ получаем токен:
{
"status": true,
"result": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDYzOTk0NjcsIm5iZiI6MTYwNjM5OTQ2NywianRpIjoiMTgxZmY2ZGQtN2FmNS00ZTUxLTlhMzAtODA3MTNhYzNlZGJlIiwiaWRlbnRpdHkiOiJrc2hua3ZuIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.DwzxBd-6Hz1Gg6O-7JIoFrBm_XzCoiOD6xIRhFUjG0Q"
}
После этого в каждый запрос добавляем заголовок
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDYzOTk0NjcsIm5iZiI6MTYwNjM5OTQ2NywianRpIjoiMTgxZmY2ZGQtN2FmNS00ZTUxLTlhMzAtODA3MTNhYzNlZGJlIiwiaWRlbnRpdHkiOiJrc2hua3ZuIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.DwzxBd-6Hz1Gg6O-7JIoFrBm_XzCoiOD6xIRhFUjG0Q"
и заходим на нужную ссылку, например для
/user
будет следующий ответ:
{
"status": true,
"result": "kshnkvn"
}