Я занимаюсь разработкой веб-проекта с микросервисами. В бэкэнде у меня есть служба входа в систему, которая отвечает за проверку учетных данных пользователя и возвращает действительный JWT. У меня есть другая служба под названием Views, которая отвечает за обслуживание пользовательского интерфейса и отправку запросов другим службам. Каждый запрос от клиента сначала посещает сервис Views, а затем запросы доставляются в соответствующие сервисы.
Код для отправки ajax запроса на маршрут "/ login" в сервисе Views:
function login(){
$('#login-form').submit(function(){
$.ajax({
url: $('#login-form').attr('action'),
type: 'POST',
data : $('#login-form').serialize(),
success: function(res, status, xhr){
window.localStorage.setItem("x-access-token", xhr.getResponseHeader("x-access-token"));
$.ajax({
url: "/user/profile",
type: "GET",
headers: {
"x-access-token": window.localStorage.getItem("x-access-token")
},
success: function () {
window.location.replace("/user/profile")
},
error: function (response) {
alert("Error in GET: " + response)
}
});
}, error: function (response) {
alert(response)
}
})
});
}
Код, который доставляет запрос в службу входа в систему:
@views_blueprint.route("/login", methods=["POST"])
def user_login():
email = request.form["email"]
password = request.form["password"]
r = requests.post("http://login:5000/login", json={"data": {"email": email, "password": password}})
try:
login_resp = r.json()
if login_resp["status"] == 201:
@after_this_request
def send_token(response):
response.headers["x-access-token"] = login_resp["token"]
return response
return json.dumps(login_resp)
else:
return render_template("/error/error.html", error_code=login_resp["status"], error_message=login_resp["message"])
except Exception as e:
return render_template("/error/error.html", error_code=500, error_message=f"Error occurred. {e}")
Я могу успешно отправить запрос входа в систему и получить токен обратно и сохранить его в localStorage. У меня проблема в том, что после входа в систему мне нужно перенаправить пользователя на защищенный маршрут, и мне нужно добавить JWT в заголовки запроса. Я пытался добиться этого с помощью ajax GET-запроса в function login()
. Однако запрос GET никогда не отправляется, вместо этого Flask отображает объект JSON, возвращенный в функции user_login()
.
Как мне решить эту проблему? Если то, что я делаю, неверно, может ли кто-нибудь указать мне правильное направление?