针对 Flask 应用的 Google OAuth 重定向 URI 不匹配错误

针对 Flask 应用的 Google OAuth 重定向 URI 不匹配错误

我有一个 Flask Web 应用程序,它托管在 Google Cloud Run 中,它托管于https://mydomain.run.app

现在我尝试向其中添加 Google 身份验证。我已在下方创建了 API证书在 GCP 中。我已经给了https://mydomain.run.app/authorize在重定向 uri 中,但当我尝试从我的应用程序登录时,它抛出了重定向不匹配错误。错误显示http://mydomain.run.app/authorize. 不匹配是httpshttp 当我尝试在凭证 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 进行响应。查看代理修复中间件或类似物。

相关内容