OAuthException: Risposta non valida da parte di Google

voti
17

Così Sto facendo funzionare la mia applicazione Flask dalla shell di cloud di Google. In questa applicazione l'utente deve effettuare il login con il proprio account Google. Ho installato tutte le librerie richieste utilizzando il guscio cloud.

Quando eseguo l'applicazione nel guscio nuvola, dopo aver scelto l'account Google che voglio accedere al mio app con, questo errore viene in su

flask_oauth.OAuthException
OAuthException: Invalid response from google

Tutto funziona bene se l'eseguo da host locale.

Qualsiasi tipo di aiuto è molto apprezzato.

PS: Questo è il codice

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)

Le mie credenziali nell'API sono

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

Perchè è il nome del progetto diverso per lo stesso cliente id e cliente segreto?

È pubblicato 17/11/2018 alle 18:55
dall'utente
In altre lingue...                            


1 risposte

voti
0

Questa domanda è davvero come impostare Google OAuth 2.0 utilizzando Flask / Python in esecuzione all'interno di un Google Cloud Shell VM.

Google OAuth autorizzazione 2.0 può essere peformed in due modalità: la modalità localhost e modalità di richiamata.

modalità localhost

Ciò richiede che l'intero processo di autenticazione essere eseguita entro la stessa macchina con un server web in esecuzione in locale. Il browser web che si collega a Google dominio deve anche essere in esecuzione all'interno della stessa macchina. Il browser non può essere in esecuzione su una macchina diversa (o VM). Dal cloud Shell non dispone di un browser Web, questa modalità non è possibile.

modalità di richiamata

Ciò richiede che il server Web è in esecuzione con TLS configurati. Google OAuth 2.0 supporta solo un URL di richiamata a un endpoint HTTPS. Questo richiede anche un nome di dominio verificato e un certificato SSL. Dal momento che né controllare il nome di dominio cloud Shell, né hanno la chiave privata per il certificato, la creazione di TLS non è possibile.

Pertanto, la risposta a questa domanda è che non è possibile impostare un processo server in esecuzione in Cloud Shell per gestire l'autenticazione di Google OAuth 2.0.

Nel caso di questo utente, l'URL di richiamata non corrisponde come il suo server di Flask web è stato configurato. In questa situazione, configurando correttamente l'URL di richiamata non è possibile.

Risposto il 18/11/2018 a 06:54
fonte dall'utente

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