2

そのため、Google クラウド シェルから Flask アプリケーションを実行しています。このアプリでは、ユーザーは Google アカウントでログインする必要があります。Cloud Shell を使用して、必要なすべてのライブラリをインストールしました。

クラウド シェルでアプリを実行すると、アプリにログインする Google アカウントを選択した後、このエラーが表示されます

flask_oauth.OAuthException
OAuthException: Invalid response from google

ローカルホストから実行すると、すべて正常に動作します。

どんな種類の助けも大歓迎です。

PS: これはコードです

Flask.py:

import logging
from flask import Flask, render_template, redirect, url_for, session, make_response
from flask_oauth import OAuth
from urllib2 import Request, urlopen, URLError
import MySQLdb
import os
import json

Client_Id = my client id
Client_Secret = my client secret
Redirect_URI = '/callback'

SECRET_KEY = 'funny cat'
DEBUG = True

app = Flask(__name__)
app.debug = DEBUG
app.secret_key = SECRET_KEY
oauth = OAuth()

google = oauth.remote_app('google', base_url='https://www.google.com/accounts/', authorize_url='https://accounts.google.com/o/oauth2/auth', request_token_url=None, request_token_params={'scope': 'https://www.googleapis.com/auth/userinfo.profile', 'response_type': 'code'}, access_token_url='https://accounts.google.com/o/oauth2/token', access_token_method='POST', access_token_params={'grant_type': 'authorization_code'}, consumer_key=Client_Id, consumer_secret=Client_Secret)

@app.route('/')
def index():
    return render_template("webpage1.html")                  

@app.route('/login',methods=['post','get'])
def login():
    access_token = session.get('access_token')
    if access_token is None:
        return redirect(url_for('direct'))

    access_token = access_token[0]
    headers = {'Authorization': 'OAuth '+access_token}
    req = Request('https://www.googleapis.com/oauth2/v1/userinfo',
                  None, headers)
    try:
        res = urlopen(req)
    except URLError, e:
        if e.code == 401:
            session.pop('access_token', None)
            return redirect(url_for('direct'))
        return res.read()
    data = json.load(res)
    return render_template("webpage2.html", data = data)

@app.route('/direct')
def direct():
    callback=url_for('authorized', _external=True)
    return google.authorize(callback=callback)

@app.route(Redirect_URI)
@google.authorized_handler
def authorized(resp):
    access_token = resp['access_token']
    session['access_token'] = access_token, ''
    return redirect(url_for('login'))

@app.route('/logout')
def logout():
    session.pop('access_token', None)
    return redirect(url_for('index'))

@google.tokengetter
def get_access_token():
    return session.get('access_token')

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)

API での私の資格情報は

Authorized JavaScript origins : https://5000-dot-4778310-dot-devshell.appspot.com   
Authorized redirect URIs : https://5000-dot-4778310-dot-devshell.appspot.com/callback   

同じクライアント ID とクライアント シークレットに対してプロジェクト名が異なるのはなぜですか?

4

1 に答える 1

2

この質問は、Google Cloud Shell VM 内で実行されている Flask / Python を使用して Google OAuth 2.0 をセットアップする方法です。

Google OAuth 2.0 認証は、localhost モードとコールバック モードの 2 つのモードで実行できます。

ローカルホスト モード

これには、ローカルで実行されている Web サーバーと同じマシン内で認証プロセス全体を実行する必要があります。Google ドメインに接続するウェブブラウザも同じマシン内で実行されている必要があります。ブラウザーを別のマシン (または VM) で実行することはできません。Cloud Shell には Web ブラウザーがないため、このモードは使用できません。

コールバック モード

これには、Web サーバーが TLS が構成された状態で実行されている必要があります。Google OAuth 2.0 は、HTTPS エンドポイントへのコールバック URL のみをサポートしています。これには、検証済みのドメイン名と SSL 証明書も必要です。Cloud Shell ドメイン名を制御しておらず、証明書の秘密鍵も持っていないため、TLS を設定することはできません。

したがって、この質問に対する答えは、Google OAuth 2.0 認証を処理するために Cloud Shell で実行されるサーバー プロセスをセットアップすることはできないということです。

このユーザーの場合、コールバック URL が Flask Web サーバーの構成方法と一致しませんでした。この状況では、コールバック URL を正しく構成することはできません。

于 2018-11-18T08:54:48.777 に答える