@ilyaux

Как во flask сделать приватный get/post запрос?

После авторизации я получаю session token и что бы пользователь мог дальше работать с rest'oм я хочу использовать запросы такого формата :

localhost/{token}/profile

Как правильно реализовать такой rest во flask ?
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
Токены нужно передавать с клиента в заголовках, а на сервере использовать валидацию для роутов, например с 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"
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы