OAuthException: Réponse non valide de Google

voix
17

Donc, je courais mon application Flask de la coquille de Google Cloud. Dans cette application, l'utilisateur doit se connecter avec leur compte Google. J'ai installé toutes les bibliothèques nécessaires à l'aide de l'enveloppe du nuage.

Quand je lance l'application dans la coquille de nuage, après avoir choisi le compte Google que je veux me connecter à mon application avec, cette erreur se

flask_oauth.OAuthException
OAuthException: Invalid response from google

Tout fonctionne bien si je le lance de l'hôte local.

Toute aide est très appréciée.

PS: Voici le code

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)

Mes informations d'identification dans l'API sont

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

Pourquoi le nom de projet différent pour le même secret d'identification du client et le client?

Créé 17/11/2018 à 18:55
utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Cette question est vraiment comment configurer Google OAuth 2.0 en utilisant Flask / Python en cours d'exécution dans un Google Cloud Shell VM.

autorisation Google OAuth 2.0 peut être peformed en deux modes: le mode localhost et le mode de rappel.

mode Localhost

Cela nécessite que le processus d'authentification entier soit effectué dans la même machine avec un serveur Web en cours d'exécution au niveau local. Le navigateur Web qui se connecte à Google de domaine doit également être en cours d'exécution dans la même machine. Le navigateur ne peut pas être en cours d'exécution sur une autre machine (ou VM). Depuis Nuage Shell ne dispose pas d'un navigateur Web, ce mode n'est pas possible.

Mode de rappel

Cela nécessite que le serveur Web est en cours d'exécution avec TLS configurés. Google OAuth 2.0 ne supporte que l'URL de rappel à un point de terminaison HTTPS. Cela nécessite également un nom de domaine vérifié et un certificat SSL. Puisque vous ne contrôler le nom de domaine Nuage Shell, ni avoir la clé privée du certificat, la mise en place TLS est impossible.

Par conséquent, la réponse à cette question est qu'il est impossible de mettre en place un processus de serveur exécutant du Cloud Shell pour gérer l'authentification Google OAuth 2.0.

Dans ce cas l'utilisateur, l'URL de rappel ne correspond comment son serveur Web Flask a été configuré. Dans ce cas, la configuration correctement l'URL de rappel est impossible.

Créé 18/11/2018 à 06:54
source utilisateur

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