OAuthException: Respuesta no válida del google

votos
17

Así que estoy corriendo mi solicitud Frasco de la cáscara de la nube de Google. En esta aplicación el usuario debe iniciar sesión con su cuenta de Google. He instalado todas las bibliotecas necesarias utilizando la cáscara nube.

Cuando ejecuto la aplicación en la capa de nubes, después de elegir la cuenta de Google que quiero acceder a mi aplicación con, este error aparece

flask_oauth.OAuthException
OAuthException: Invalid response from google

Todo funciona bien si lo ejecuto desde el host local.

Cualquier tipo de ayuda es muy apreciada.

PD: Este es el código

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)

Mis credenciales en la API son

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

¿Por qué es el nombre del proyecto diferente para el mismo ID de cliente y el cliente secreto?

Publicado el 17/11/2018 a las 18:55
por usuario
En otros idiomas...                            


1 respuestas

votos
0

Esta cuestión es realmente cómo configurar Google OAuth 2.0 usando Frasco / Python se ejecuta dentro de una máquina virtual de Google Cloud Shell.

Google autorización OAuth 2.0 se puede peformed en dos modos: modo de localhost y el modo de devolución de llamada.

modo localhost

Para ello es necesario que todo el proceso de autenticación se lleva a cabo dentro de la misma máquina con un servidor web que se ejecuta localmente. El navegador web que se conecta a Google de dominio también debe estar en funcionamiento dentro de la misma máquina. El navegador no puede estar ejecutándose en una máquina diferente (o VM). Dado que la nube de Shell no tiene un navegador web, este modo no es posible.

modo de devolución de llamada

Esto requiere que el servidor Web se está ejecutando con TLS configurados. Google OAuth 2.0 sólo es compatible con una URL de devolución de llamada a un punto final HTTPS. Esto también requiere un nombre de dominio verificado y un certificado SSL. Ya que ni controlar el nombre de dominio de la nube de Shell, ni tienen la clave privada del certificado, la creación de TLS no es posible.

Por lo tanto, la respuesta a esta pregunta es que no es posible configurar un proceso de servidor que se ejecuta en la nube de Shell para manejar Google autenticación OAuth 2.0.

En el caso de este usuario, la URL de devolución de llamada no coincide con cómo se ha configurado su servidor web frasco. En esta situación, configurar correctamente la URL de devolución de llamada no es posible.

Respondida el 18/11/2018 a las 06:54
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more