这让我非常抓狂,并阻止我进行本地开发/测试。
我有一个使用authlib的flask应用程序(仅限客户端功能)。当用户访问我的主页时,我的flask后端会将他们重定向到/login,然后再重定向到Google Auth。然后Google Auth将它们发布回我的应用的/auth端点。
几个月来,我一直遇到authlib.integrations.base_client.errors.MismatchingStateError的特殊问题:mismatching_state:CSRF警告!请求和响应不相等。这感觉就像一个cookie的问题,大多数时候,我只是打开一个新的浏览器窗口或隐身或尝试清除缓存,最终,它的工作排序。
然而,我现在在Docker容器中运行完全相同的应用程序,并且在某个阶段这是有效的。我不知道我已经改变了什么,但每当我浏览到localhost/或127.0.0.1/并通过auth过程(每次清除cookie以确保我没有自动登录),我不断重定向回localhost/auth?state=blah blah blah我遇到了这个问题:authlib.integrations.base_client.errors.MismatchingStateError:mismatching_state: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
5条答案
按热度按时间z8dt9xmd1#
问题是SECRET_KEY是使用os.random填充的,这会为不同的工作进程产生不同的值,因此无法访问会话cookie。
xwbd5t1u2#
@adamcunnington这里是你如何调试它:
检查
request.args
和session
中的值以了解发生了什么。可能是因为Flask session not persistent across requests in Flask app with Gunicorn on Heroku
eyh26e7m3#
如何修复问题
安装旧版本authlib,它可以很好地与fastapi和flask配合使用
对于Fastapi
* 如果使用本地主机进行Google身份验证,请确保获得https证书 *
安装chocolatey并设置https查看本教程
-我的代码-
.env文件
Google控制台设置
nfeuvbwi4#
我在FastAPI中遇到了同样的问题。对我有用的是在-
sessionMiddleware
和oauth.register
-位置设置相同的密钥:In respective python module:
In main.py (or wherever you declare app = FastAPI()):
ljsrvy3e5#
我通过在浏览器中硬刷新应用程序解决了这个问题。看起来我已经在代码中更改了一些客户端ID并重新启动了应用程序,但我仍然在浏览器中从我自己的应用程序的过时版本中单击登录按钮。