簡體   English   中英

如果標題上存在訪問令牌,如何將授權 header 添加到請求中,以便可以訪問帶有 @jwt_required 的 flask 路由

[英]How can I add Authorization header to a request so that a flask route with @jwt_required can be access if access token is present on the headers

我正在嘗試將 flask_jwt_extended 實施到我的 flask 應用程序中。

我的用例是,我想為每個請求設置授權標頭。 因此,當 @jwt_required 裝飾器被裝飾為 flask 路由時,如果授權標頭上存在訪問令牌,則可以訪問它。 我嘗試了一些解決方案,如下所示:

我使用@app.after_request 將標頭附加到每個請求,但它仍然給了我這個響應

{
  "msg": "Missing Authorization Header"
}

這是我的代碼:

@app.after_request
def add_headers(resp):
    access_token = session.get("access_token", None)
    if access_token is not None:
        resp.headers["Authorization"] = f"Bearer {access_token}"
        return resp
    return resp

我的登錄路線:

@app.route('/', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        form = request.form
        _username = form["username"]
        _password = form["password"]
        for username in Users:
            if username.get(_username):
                if safe_str_cmp(username[_username]["password"],_password):
                    access_token = create_access_token(identity=username[_username]["user_id"], fresh = True)
                    session["access_token"] = access_token
                    res = make_response(redirect(url_for("home")))
                    res.headers["Authorization"] = f"Bearer {access_token}"
                    return res
                else:
                    return "Incorrect password"
        return f"Hello{_username} doesn't exist"
    return render_template("login.html")

這是我的受保護路線:

@app.route('/home')
@jwt_required
def home():
    res = Response(render_template("base.html"))
    return res

我也嘗試在路由中添加我的標題,但我指定的標題仍然無法識別並且仍然給我相同的響應消息。 這是怎么做的

@app.route('/home')
@jwt_required
def home():
    access_token = session.get("access_token", None)
    print(access_token)
    if access_token is not None:
        res = Response(render_template("base.html"), headers={"Authorization" : f"Bearer {access_token}"})
        return res
    res = Response(render_template("base.html"))
    return res

為那些將遇到此問題並嘗試實施 OAuth 流程的人編寫此內容

不要使用裝飾器,而是使用中間件

我相信你應該在中間件中處理這個問題。 在中間件中,您可以設置調用 function 的第二個參數的授權屬性,其中包含您在 init function 中傳遞的當前 wsgi 應用程序環境變量。 看下面的代碼:

def __init__(self, app):
    self.app = app

def __call__(self, environ, start_response):
    cookie = Request(environ).cookies.get('access_token')
    if cookie is not None:
        environ['HTTP_AUTHORIZATION']='Bearer '+cookie
    return self.app(environ, start_response)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM