我有一个 Flask Web 应用程序,它托管在 Google Cloud Run 中,它托管于https://mydomain.run.app。
现在我尝试向其中添加 Google 身份验证。我已在下方创建了 API证书在 GCP 中。我已经给了https://mydomain.run.app/authorize在重定向 uri 中,但当我尝试从我的应用程序登录时,它抛出了重定向不匹配错误。错误显示http://mydomain.run.app/authorize. 不匹配是https和http 当我尝试在凭证 uri 中提供 http 时,它抛出了我
Invalid Redirect: This app has a publishing status of "In production". URI must use https:// as the scheme.
@app.route('/login/google')
def google_login():
google = oauth.create_client('google')
redirect_uri = url_for('authorize', _external=True,_scheme='https')
return google.authorize_redirect(redirect_uri)
@app.route('/authorize')
def authorize():
google = oauth.create_client('google')
token = google.authorize_access_token()
resp = google.get('userinfo')
user_info = resp.json()
user = oauth.google.userinfo()
session['profile'] = user_info
session.permanent = True
return redirect('/select')
然后我知道我的应用程序本身只发送 http 请求,所以我尝试在重定向时在 url_for 中添加 _scheme='https',但现在我得到了authlib.integrations.base_client.errors.MismatchingStateError:mismatching_state:CSRF 警告!请求和响应中的状态不一致。错误。我已将密钥更改为静态字符串,而不是从其他答案中获得的随机数。但还无法解决这个问题。
答案1
您的 Cloud Run 服务前面是 GFE(Google FrontEnd)。您的应用使用 HTTPS 连接到 GFE,如果使用 HTTP 连接,则会重定向到 HTTPS。GFE 使用 HTTP 连接到您的应用。
您的应用程序认为客户端使用 HTTP 连接,因此使用 http:// URL 进行响应。您需要处理 X-Forwarded-Proto 以检测客户端连接方法,然后使用正确的 HTTPS URL 进行响应。查看代理修复中间件或类似物。