OAuthException: недопустимый ответ от Google

Итак, я запускаю свое приложение Flask из облачной оболочки Google. В этом приложении пользователю необходимо войти в систему со своей учетной записью Google. Я установил все необходимые библиотеки с помощью облачной оболочки.

Когда я запускаю приложение в облачной оболочке, после выбора учетной записи 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   

Почему название проекта отличается для одного и того же идентификатора клиента и секрета клиента?


person rini saha    schedule 17.11.2018    source источник
comment
Что вы настроили в Client ID for Web application в Google Cloud Console? Authorized JavaScript origins и Authorized redirect URIs должны быть правильными. Это означает как URL-адрес, так и номер порта.   -  person John Hanley    schedule 18.11.2018
comment
Все в порядке. Меня просят выбрать учетную запись Google, которую я хочу использовать для входа в систему. Я тоже даю пароль. Проблема, кажется, возникает после обратного вызова. Если бы проблемы были Authorized JavaScript origins и Authorized redirect URIs, меня бы вообще не перенаправили на страницу учетных записей Google.   -  person rini saha    schedule 18.11.2018
comment
Вы перенаправляете URL неверно. Как я уже говорил, у вас должен быть правильный порт. Ваш сервер Flask настроен для HTTP на порту 8080. Ваш URI перенаправления настроен для HTTPS и порта 443. Они не совпадают. На вашем сервере Flask не используется протокол HTTPS, который является обязательным, за исключением режима localhost. Ваш сервер Flask прослушивает localhost, что означает, что он никогда не получит обратный вызов. Однако, если вы действительно запускаете это в режиме localhost, тогда URI перенаправления должен быть localhost: 8080.   -  person John Hanley    schedule 18.11.2018
comment
Если вы работаете в режиме localhost, ваш веб-браузер также должен работать на том же компьютере (vm). У Cloud Shell нет веб-браузера.   -  person John Hanley    schedule 18.11.2018
comment
Где мне внести изменения, чтобы запустить HTTPS на моем флеш-сервере?   -  person rini saha    schedule 18.11.2018
comment
Откуда вы взяли URL-адреса для своего Cloud Shell? Мне интересно. Помните, что они будут меняться каждый раз, когда вы запускаете Cloud Shell.   -  person John Hanley    schedule 18.11.2018
comment
Вы не сможете настроить HTTS для Flask, работающего в Cloud Shell. Для обслуживания трафика HTTPS вам понадобится сертификат SSL. У вас его нет для домена Cloud Shell.   -  person John Hanley    schedule 18.11.2018
comment
Создайте новый вопрос о настройке SSL для Flask, и я отвечу на него.   -  person John Hanley    schedule 18.11.2018
comment
Каждый раз, когда я запускаю python Flask.py в облачной оболочке, они дают ссылку в оболочке. Это URI, на который меня направляют каждый раз, когда я нажимаю на него. И он остается неизменным каждый раз. Это не меняет   -  person rini saha    schedule 18.11.2018
comment
Он изменится через 60 минут простоя. Затем Cloud Shell отключается и удаляется. При следующем подключении запускается новая виртуальная машина. Данные, которые вы храните относительно вашего домашнего каталога, сохраняются, но ничего больше. Это также означает, что ваши библиотеки Python должны быть установлены относительно вашего домашнего каталога.   -  person John Hanley    schedule 18.11.2018
comment
Создание нового вопроса   -  person rini saha    schedule 18.11.2018
comment
Я могу опубликовать этот вопрос через 90 минут   -  person rini saha    schedule 18.11.2018
comment
Пожалуйста, не изменяйте существующий вопрос. Создайте новый вопрос.   -  person John Hanley    schedule 18.11.2018
comment
Причина разницы в том, что у вас нет подтвержденного доменного имени, связанного с вашим идентификатором клиента.   -  person John Hanley    schedule 18.11.2018
comment
Но имя, которое я дал своему проекту с указанным выше идентификатором клиента и секретом, - это Sample GCP.   -  person rini saha    schedule 18.11.2018
comment
При работе в режиме localhost, для которого не требуется подтвержденный домен, отображается имя вашего приложения. При работе в режиме обратного вызова вам необходим подтвержденный домен, чтобы в аккаунте Google отображался URL-адрес, а не имя приложения.   -  person John Hanley    schedule 18.11.2018
comment
На ваш первоначальный вопрос был дан ответ. Отметьте это как завершенное и создайте новые вопросы.   -  person John Hanley    schedule 18.11.2018


Ответы (1)


Этот вопрос действительно заключается в том, как настроить Google OAuth 2.0 с помощью Flask / Python, работающего внутри виртуальной машины Google Cloud Shell.

Авторизация Google OAuth 2.0 может выполняться в двух режимах: в режиме локального хоста и в режиме обратного вызова.

Режим локального хоста

Для этого необходимо, чтобы весь процесс аутентификации выполнялся на одном компьютере с локально работающим веб-сервером. Веб-браузер, который подключается к домену Google, также должен работать на том же компьютере. Браузер не может работать на другом компьютере (или виртуальной машине). Поскольку в Cloud Shell нет веб-браузера, этот режим невозможен.

Режим обратного звонка

Для этого требуется, чтобы веб-сервер работал с настроенным TLS. Google OAuth 2.0 поддерживает только URL-адрес обратного вызова для конечной точки HTTPS. Для этого также требуется проверенное доменное имя и сертификат SSL. Поскольку вы не управляете ни доменным именем Cloud Shell, ни закрытым ключом для сертификата, настройка TLS невозможна.

Следовательно, ответ на этот вопрос заключается в том, что невозможно настроить серверный процесс, работающий в Cloud Shell, для обработки аутентификации Google OAuth 2.0.

В случае этого пользователя URL-адрес обратного вызова не соответствовал настройке его веб-сервера Flask. В этой ситуации правильная настройка URL-адреса обратного вызова невозможна.

person John Hanley    schedule 18.11.2018