Колба возвращает токен JWT при перенаправлении

Я следовал этому руководству Flask pyjwt, однако мое веб-приложение чем-то похоже на пример микроблога Мигеля, который использует render_template() а также redirect(url_for(...)) для навигации.

В моем приложении реализована служба кодирования и декодирования, однако я не знаю, как правильно вернуть закодированный токен JWT пользователю, используя redirect()

Мой код выглядит следующим образом:

@app.route('/', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    username = login_form.username.data
    password = login_form.password.data

    if is_user_valid(username, password):
        return redirect(url_for('home'), auth_service.encode_token(username))
    render_template('login.html', form=login_form)

Моя проблема с размещением токена аутентификации в методе перенаправления приводит к появлению страницы с надписью "Перенаправление... вы должны быть перенаправлены, если не нажмите здесь", чего я не хочу. Я не особо хочу менять методы перенаправления на что-то похожее на make_response(jsonify(...)) как тогда мне нужно было бы обрабатывать эти ответы во внешнем интерфейсе, когда это простая страница входа.

Как правильно вернуть клиенту токен авторизации?

2 ответа

Как правило, вы присоединяете его к заголовкам ответа, что является вашим redirect метод возвращает.

response = redirect(url_for('home'))
response.headers['X-JWT-TOKEN'] = auth_service.encode_token(username)
return response

Тем не менее, я не уверен, что это будет очень полезно в вашей настройке при использовании render_template, потому что вы не можете легко получить доступ к этим заголовкам на веб-интерфейсе.

У вас есть две альтернативы здесь:

  • Сделайте вашу конечную точку входа API. Таким образом, вы можете вернуть токен для клиентского кода, чтобы обрабатывать и как-то его хранить.
  • Оставьте JWT и придерживайтесь использования сессий. Я знаю, что это не то, что вы ожидали, но вне построения API аутентификация на основе JWT не очень полезна.

Для этого вы также можете использовать cookie.

      @app.route('/login', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    username = login_form.username.data
    password = login_form.password.data

    if request.method == 'POST' and is_user_valid(username, password):
        response = redirect('/')
        response.set_cookie('Authorization',auth_service.encode_token(username))
        return redirect(url_for('home'), )
    render_template('login.html', form=login_form)

в вашем промежуточном программном обеспечении вы можете сделать что-то вроде этого:

      def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        if "Authorization" in request.cookies:
            token = request.cookies["Authorization"]
            return f(token, *args, **kwargs)
        else:
            redirect(url_for('login', )

    return decorated

домашний метод можно обернуть этой оберткой:

      @app.route("/home")
@token_required
def counter_page(token):
    pass # do something with token
Другие вопросы по тегам