Колба возвращает токен 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