不匹配状态错误:不匹配状态:CSRF警告!请求和响应不相等的状态

2024-06-01 00:22:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这简直让我发疯,让我无法进行本地开发/测试

我有一个flask应用程序,它使用authlib(仅限客户端功能)。当用户点击我的主页时,我的flask后端会将他们重定向到/login,然后再重定向到GoogleAuth。Google Auth然后将它们发布回我的应用程序的/Auth端点

几个月来,我一直在遇到authlib.integrations.base_client.errors.mistchingstateError:mistching_state:CSRF警告的特殊问题!请求和响应中的状态不相等。这感觉像是一个cookie问题,大多数时候,我只是打开一个新的浏览器窗口,或者隐姓埋名,或者尝试清除缓存,最终,它可以正常工作

然而,我现在在docker容器中运行完全相同的应用程序,并且在某个阶段这是可行的。我不知道我改变了什么,但每当我浏览到localhost/或127.0.0.1/并通过身份验证过程(每次清除cookies以确保我没有自动登录)时,我总是被重定向回localhost/auth?state=blah blah blah blah,我遇到这个问题: authlib.integrations.base_client.errors.MismatchingStateError:mismatching_状态:CSRF警告!请求和响应中的状态不相等

我认为我的代码的相关部分是:

@app.route("/", defaults={"path": ""})
@app.route("/<path:path>")
def catch_all(path: str) -> Union[flask.Response, werkzeug.Response]:
    if flask.session.get("user"):
        return app.send_static_file("index.html")
    return flask.redirect("/login")


@app.route("/auth")
def auth() -> Union[Tuple[str, int], werkzeug.Response]:
    token = oauth.google.authorize_access_token()
    user = oauth.google.parse_id_token(token)
    flask.session["user"] = user
    return flask.redirect("/")


@app.route("/login")
def login() -> werkzeug.Response:
    return oauth.google.authorize_redirect(flask.url_for("auth", _external=True))

我将非常感谢任何帮助

当我在本地运行时,我从以下内容开始:

export FLASK_APP=foo && flask run

当我在docker容器内运行时,我从以下内容开始:

.venv/bin/gunicorn -b :8080 --workers 16 foo

Tags: pathtokenauthapp应用程序flaskreturnresponse
3条回答

在我的代码中,我有静态密钥和所有必需的代码更改。在本地尝试时代码运行良好,但在部署到aws后尝试时出错。它不断给我错误

authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF Warning! State not equal in request and response.

问题是使用os.random填充密钥,这会为不同的工作者生成不同的值,因此无法访问会话cookie

@adamcunnington以下是调试它的方法:

@app.route("/auth")
def auth() -> Union[Tuple[str, int], werkzeug.Response]:
    # Check these two values
    print(flask.request.args.get('state'), flask.session.get('_google_authlib_state_'))

    token = oauth.google.authorize_access_token()
    user = oauth.google.parse_id_token(token)
    flask.session["user"] = user
    return flask.redirect("/")

检查request.argssession中的值以查看发生了什么

也许是因为Flask session not persistent across requests in Flask app with Gunicorn on Heroku

相关问题 更多 >