web-dev-qa-db-ja.com

flask応答にsamesite = Noneを明示的に設定する方法

Chrome=に到着する変更のため、SameSite = Noneキー値を明示的に提供するようにアプリを変更する必要があります。これは、RFCがこの設定の欠如をより影響のあるものとして扱っているためです存在する場合よりも方法はありますが、なしに設定されています。

ただし、set_cookieメソッドでは、samesiteパラメーターはデフォルトでNoneに設定されているため、set-cookieに書き込まれません。これを応答のcookie設定部分に強制するにはどうすればよいですか?

次のコードでsamesite = Noneを設定しようとすると

resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite=None, max_age=63072000) 

これは、返されたset-cookieにSameSiteの詳細を表示しません

abcid =こんにちは; Domain = .localhost; Expires = Tue、29-Jun-2021 22:34:02 GMT; Max-Age = 63072000;パス= /

そして、Laxの値(rfcごとに受け入れられる値の1つ)を明示的に設定しようとすると、

resp.set_cookie('abcid', "Hello", domain=request_data.domain, path='/', samesite="Lax", max_age=63072000)

SameSite = Lax設定が明示的に設定されているset-cookieを取得します

abcid =こんにちは; Domain = .localhost; Expires = Tue、29-Jun-2021 23:03:10 GMT; Max-Age = 63072000;パス= /; SameSite = Lax

なし、「なし」、「」を試してみましたが、これらはアプリケーションをクラッシュさせるか、結果の応答でSameSiteを省略します。

どんな助けでもありがたいです

9
Mark Ruse

この問題の修正 がリリースされると、次のように set_cookie() を使用できるようになります。

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def hello_world():
    resp = make_response('Hello, World!');
    resp.set_cookie('same-site-cookie', 'foo', samesite='Lax');
    resp.set_cookie('cross-site-cookie', 'bar', samesite='Lax', secure=True);
    return resp

リリースを待っている間も、明示的に ヘッダーを設定 できます。

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def hello_world():
    resp = make_response('Hello, World!');
    resp.set_cookie('same-site-cookie', 'foo', samesite='Lax');
    # Ensure you use "add" to not overwrite existing cookie headers
    resp.headers.add('Set-Cookie','cross-site-cookie=bar; SameSite=None; Secure')
    return resp
4
rowan_m

修正がリリースされるまで、次のコードを使用してSameSite=NoneでCookieを設定することもできます

from werkzeug.http import dump_cookie

# That's a workaround for explicitly setting SameSite to None
# Until the following fix is released: 
# https://github.com/pallets/werkzeug/issues/1549
def set_cookie(response, *args, **kwargs):
    cookie = dump_cookie(*args, **kwargs)

    if 'samesite' in kwargs and kwargs['samesite'] is None:
        cookie = "{}; {}".format(cookie, b'SameSite=None'.decode('latin1'))

    response.headers.add(
        'Set-Cookie',
        cookie
    )
1
tilalis