OAuthException: Ungültige Antwort von Google

stimmen
17

So leite ich meine Flask-Anwendung von dem Google Cloud Shell. In dieser App muss die Nutzer mit ihrem Google-Konto anmelden. Ich installiert alle benötigten Bibliotheken die Cloud-Shell.

Wenn ich die app in der Cloud Shell ausgeführt, nach dem Google-Konto wählen möchte ich in meiner App anmelden, kommt dieser Fehler auf

flask_oauth.OAuthException
OAuthException: Invalid response from google

Alles funktioniert gut, wenn ich es von den lokalen Host ausgeführt werden.

Jede Art von Hilfe ist sehr geschätzt.

PS: Dies ist der 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)

Meine Anmeldeinformationen in der API sind

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

Warum ist der Projektname anders für den gleichen Kunden-ID und Client-Geheimnis?

Veröffentlicht am 17/11/2018 um 18:55
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Diese Frage ist wirklich, wie die Einrichtung Google OAuth 2.0 mit Flask / Python in einem Google Cloud Shell VM ausgeführt wird.

localhost-Modus und Callback-Modus: Google OAuth 2.0 Ermächtigung kann in zwei Modi peformed werden.

Lokaler Host-Modus

Dies erfordert, dass der gesamte Authentifizierungsprozess mit einem lokal laufenden Web-Server innerhalb der gleichen Maschine durchgeführt werden. Der Web-Browser, die Google Domain verbindet, muss auch innerhalb der gleichen Maschine laufen. Der Browser kann nicht auf einer anderen Maschine ausgeführt werden (oder VM). Da Cloud Shell keinen Web-Browser haben, ist dieser Modus nicht möglich.

Rückruf-Modus

Dies erfordert, dass der Web-Server mit TLS ausgeführt wird konfiguriert. Google OAuth 2.0 unterstützt nur eine Callback-URL zu einem HTTPS-Endpunkt. Dies erfordert auch einen überprüfte Domain-Namen und ein SSL-Zertifikat. Da Sie die Cloud Shell Domain-Namen steuern weder, noch die privaten Schlüssel für das Zertifikat haben, TLS Einrichtung ist nicht möglich.

Daher ist die Antwort auf diese Frage, dass es nicht möglich, die Einrichtung ist ein Serverprozess in Cloud Shell läuft Google OAuth 2.0-Authentifizierung zu behandeln.

In diesem Fall wird der Benutzer hat die Callback-URL nicht überein, wie sein Flask Web-Server konfiguriert wurde. In dieser Situation ist die Callback-URL korrekt Konfiguration nicht möglich.

Beantwortet am 18/11/2018 um 06:54
quelle vom benutzer

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