簡體   English   中英

在Heroku上使用Flask應用程序進行奇怪的會話行為

[英]Strange session behaviour with a Flask app on Heroku

我有一個使用GitHub的OAuth API的Web應用程序,以允許該應用程序的用戶與GitHub交互。 但是,關於會話cookie,我看到一些非常奇怪的行為。

作為背景知識,我使用peewee與Heroku的Postgres服務器進行交互,並具有如下的User模型:

class User(peewee.Model):
    login = peewee.TextField(unique=False)
    token = peewee.TextField()

我正在使用GitHub OAuth文檔中描述的Web應用程序流程,並成功地使用訪問令牌成功回叫,該令牌存儲在數據庫以及會話中[1]:

@app.route('/callback')
def finishlogin():
    # I've verified that `token` and `login` are both valid at this point
    user = User.create(login=login, token=token)

    session['token'] = token

    return redirect(url_for('home'))

home路線如下:

@app.route('/')
def home():
    if 'token' in session:
        user = User.get(token=session.get('token'))

        return 'Your login is {}'.format(user.login)
    else:
        # ...

到目前為止,一切都很好,並且可以正常工作。 但是,我遇到了一些用戶登錄,刷新頁面並發現他們突然以其他人身份登錄的實例。 將請求記錄到應用程序后,表明在第二個請求上,會話cookie本身發送了錯誤的值(即home() session.get('token') home()返回的是有效值,但不正確。很明顯,用戶的瀏覽器無法知道任何其他會話值,因此在不同客戶端和請求之間設置會話似乎有些“泄漏”。

我不確定可能是什么問題。 我的數據庫按照peewee文檔中的描述存儲在Flask g對象上,並設置了before_requestteardown_request鈎子來打開和關閉數據庫連接,並且從我閱讀的所有文檔和示例代碼中(我已經讀了很多東西) !),我似乎正確使用了會話對象。 我已經為會話存儲設置了一個工作中的secret_key

我想知道Heroku及其路由網格是否可能正在發生這種情況? 但是,然后,一個用戶將如何突然發送另一用戶的會話?

任何提示或建議都將不勝感激-我已經凝視了很久了,很機智。

[1]我知道直接存儲令牌是一個錯誤的設計選擇。 該應用程序是非公開的,並且將得到修復,但是現在我想描述存在的問題,即使它不是理想的。

回答我自己的問題,以備將來參考。

看來這是由於Flask的默認會話Cookie行為引起的,該行為是在每次請求發送Set-Cookie標頭,即使對於靜態資產也是如此。 因此,我們本地的Squid代理很高興地緩存了這些請求並為每個用戶重新發出Set-Cookie標頭。

為整個應用程序設置Cache-Control標頭似乎可以解決此問題。

暫無
暫無

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

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