Google App Engine烧瓶SSL和OAuth2问题 - python

我正在尝试在自定义域上使用oauth2身份验证在Google App Engine python 3 flexible env上创建Flask Web应用程序。
因此,问题如下:
1)我已将自定义域添加到我的项目中,并且还向该自定义域添加了SSL。在Google Cloud Console中,一切似乎都很好,但是SSL无法在我的自定义域上显示/工作。
也许问题在我的调度文件中?

dispatch:
    - url: 'mycustomdomain.com/'
      service: default

    - url: 'www.mycustomdomain.com/'
      service: default

2)尽管https://[project-id].appspot.com上具有SSL,我仍无法登录。按“使用Google登录”后,我将重定向到/ authorize,在这里我选择要登录的帐户。发生这种情况后,重定向到/ oauth2callback,https神秘地更改为http并且我无法登录,并得到以下错误InsecureTransportError: (insecure_transport) OAuth 2 MUST utilize https.
Python授权:

@app.route('/authorize')
def authorize():

    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        CLIENT_SECRETS_FILE, scopes=SCOPES)

    flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

    authorization_url, state = flow.authorization_url(
        access_type='offline',
        include_granted_scopes='true')  

    flask.session['state'] = state
    return flask.redirect(authorization_url)

Python oauth2callback:

@app.route('/oauth2callback')
def oauth2callback():

    state = flask.session['state']

    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
    flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

    authorization_response = flask.request.url
    flow.fetch_token(authorization_response=authorization_response)

    credentials = flow.credentials

    flask.session['credentials'] = credentials_to_dict(credentials)
    session = flow.authorized_session()
    flask.session['username_output'] = session.get(
        'https://www.googleapis.com/userinfo/v2/me').json()

    return flask.redirect(flask.url_for('map'))

在本地测试时,我正在使用os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'并在本地正常工作任何建议?


问题解决了 -
1)我忘记将SSL证书添加到域(托管域),这就是为什么SSL无法显示的原因。我知道,这么so脚的错误。
2)首先,我将SSL和SSLify强制用于flask,但这并不能解决问题,在以下行中

authorization_response = flask.request.url

不管怎样,这行代码给了我http://,我试图将我可以在flask.url_for(_scheme ='https')中找到的所有方案都更改为https,但这都没有帮助,所以现在,我的解决方法是

authorization_response = authorization_response.replace('http', 'https')

我知道,这不是最好的解决方案,但是可以。

参考方案

我也遇到了这个问题,发现该问题源于authorization_response = flask.request.url,因为该URL默认为HTTP而不是HTTPS。

我的hacky解决方案是运行一个快速的正则表达式替换,并将URL强制为HTTPS:

import re
....
authorization_response = request.url
new_auth = re.sub(
    "http:",
    "https:",
    authorization_response
)
flow.fetch_new_token(new_auth)

当然,有更好的方法可以完成此操作,但是它可以工作。

flask:异常后停止服务器 - python

我想在发生未处理的异常时立即停止我的Flask服务器。这是一个例子:from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): 1/0 # argh, exception return 'Hello World!' i…

使用nodejs中的前端和python中的后端服务器运行Google App Engine的一个实例 - python

我对GCP和GAE,nodejs和python及网络(我知道)感到不知所措。[+]我有:基本上,我有一些nodejs代码,它们接受一些输入,然后应该将该输入发送到一些python代码,它将对它做更多的工作。我的第一个想法是通过GAE部署nodejs代码,然后将python代码托管在python服务器中,然后从nodejs前端向python服务器后端发出发布请…

为什么我的环境变量无法加载到我的flask应用程序中? - python

不确定是否要在Linux中发布在这里,但是我遇到了一些麻烦。我有一个需要环境变量的Flask博客应用程序。我正在使用os模块访问它们,如下所示:import os app.config['SECRET_KEY'] = os.environ['SECRET_KEY'] 但是,当我这样做时,我在“秘钥”上收到KeyErro…

WTForms Flask(wtf_flask)验证程序如何为RadioField包括“必需”属性 - python

我基本上在寻找的是WTForms的InputRequired()的RadioField等效验证器。我的意思是,当您尝试提交表单而不在具有InputRequired()验证器的StringField字段中输入任何文本时,用户会在文本字段上方看到提示,提示是"Please fill out this field"。我希望用户必须选择male或…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…