Отправить почтовый запрос с помощью flask_jwt_extended - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь отправить почтовый запрос на сервер Flask, который использует токены flask_jwt_extended. Я не хочу, чтобы страница обновлялась sh после каждой отправки, и мне удалось сделать это с помощью jquery. Но я не могу отправить токен CSRF таким образом, чтобы flask_jwt_extended мог аутентифицировать пользователя.

function myfunction(action, id, csrf_token){
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://127.0.0.1:5000/accept", true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify({
        action: action,
        id: id,
            csrf_token: csrf_token
        }));
}

$(document).ready(function() {
    $(document).on('click', '#my-form', function(event) {
            var action =  $(event.target).attr('value');
            var f = $(this);
            csrf_token = f.find('input[id=csrf_token]');
            myfunction(action, f.find('[name=song_id]').val(), csrf_token)
      return false;
     });
});
@app.route('/accept', methods=["POST"])
@jwt_required
def accept():
    user = get_jwt_identity()
    ...

Когда я пытаюсь выполнить следующее, я получаю ошибку 401, что неудивительно, поскольку я не передаю токен csrf как в форме. Если я просто отправлю запрос на публикацию в форме, он будет работать нормально.

РЕДАКТИРОВАТЬ: На моем бэкэнде я использую следующие настройки для flask_jwt_extended:

app.secret_key = 'loginner'
app.config['JWT_SECRET_KEY'] = 'super-secret'
app.config['JWT_TOKEN_LOCATION'] = ['cookies', 'headers']
app.config['JWT_BLACKLIST_ENABLED'] = True
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access', 'refresh']
app.config['JWT_COOKIE_CSRF_PROTECT'] = False # the bearer request works when this is False, but ideally it would be True
app.config['JWT_CSRF_CHECK_FORM'] = True

И я получаю идентификацию в следующем виде:

@app.route('/accept', methods=["POST"])
@jwt_required
def accept():
    user = get_jwt_identity()
    ...

Это работает как и ожидалось, когда app.config['JWT_COOKIE_CSRF_PROTECT'] = False

1 Ответ

0 голосов
/ 08 мая 2020

В вашем вопросе не указано, как вы обрабатываете JWT на стороне клиента, но основной c ответ заключается в том, что вам необходимо передать заголовок авторизации с вашим запросом (подробнее см. В нижней части страницы в flask_jwt_extended документы). Может возникнуть некоторая путаница в том, что CSRF и идентичность - это не одно и то же. CSRF просто помогает вашему интерфейсу и API понять, что они могут доверять друг другу. Такой пакет, как flask_jwt_extended, помогает вашему бэкэнду идентифицировать пользователя и авторизовать запросы.

В приведенном выше примере клиента вы должны добавить еще одну строку заголовка как таковую:

// the 'jwt' variable refers to however you have stored the token. Change as needed
xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);
...