Как я могу перенаправить на защищенный URL после входа в систему Flask? - PullRequest
0 голосов
/ 06 января 2020

Я занимаюсь разработкой веб-проекта с микросервисами. В бэкэнде у меня есть служба входа в систему, которая отвечает за проверку учетных данных пользователя и возвращает действительный 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().

Как мне решить эту проблему? Если то, что я делаю, неверно, может ли кто-нибудь указать мне правильное направление?

...