2016-05-25 17 views
0

Ich versuche zu tun, um eine Web-Anwendung mit dem OAuthlib mit Google anmelden, ist das, was das Objekt Google wie folgt aussieht:Wie json Daten Python-Objekt übersetzen - Flask

google = oauth.remote_app('google', 
    request_token_url=None, 
    access_token_method='POST', 
    request_token_params={'scope': 'email'}, 
    access_token_url='https://accounts.google.com/o/oauth2/token', 
    authorize_url='https://accounts.google.com/o/oauth2/auth', 
    consumer_key="my consumer", 
    consumer_secret="my secret", 
    base_url='https://www.googleapis.com/oauth2/v1/' 
) 

Das Problem, das ich hve ist, wenn ich die Benutzerinformationen von google zu bekommen, ist seine meine Genehmigung Ansicht:

@app.route('/login/authorized/<provider>') 
def authorized(): 
    resp = google.authorized_response() 
    auth_error(resp) 
    id_token = json.load(resp['id_token']) 
    login_user(me, True) 
    return redirect(url_for('index')) 

Also, versuchen Sie, was ich mit dem json.load zu tun ist, die Information google gibt mir, in diesem speziellen Fall zu entschlüsseln, die Antwort hat eine ID_Token, die eine lange Zeichenfolge ist, die nach meinen Recherchen ist eine JSON-codierte Zeichenfolge wh en es decodiert wird, liefert alle Benutzerinformationen, egal wie sehr ich versuche ich nicht die richtige Art und Weise scheinen zu finden, sie zu entschlüsseln, ich die Fehlermeldung erhalten, ist:

AttributeError: 'unicode' object has no attribute 'read' 

Auf der json.load Linie .

EDIT: nach dem Decodieren der ID_Token würde ich es dann verwenden, um den Benutzer in meiner eigenen Datenbank zu erhalten oder zu erstellen.

Ich benutze Flask und die Bibliothek ist JSON.

Wenn jemand den richtigen Weg erklären könnte, um die Zeichenfolge in ein Python-Objekt zu dekodieren, würde ich es sehr schätzen, oder wenn dies nicht JSON ist, aber eine andere Art von codierter Zeichenfolge bitte sagen. Vielen Dank im Voraus.

Antwort

3

json.loadreads from a file. Um einen JSON String zu dekodieren, verwenden Sie json.loads.

Laut these docs ist id_token jedoch kein JSON, sondern ein "JSON Web Token".

Wenn Sie für die „Nutzlast“ suchen, könnten Sie versuchen:

payload = json.loads(resp['id_token'].split('.')[1].decode('base64')) 
+0

wenn ich json.loads verwende ich bekommen Valueerror: keine JSON-Objekt decodiert werden konnte, vielleicht bin ich nicht sehr gut erklären, was google zurückkehrt, würde ich es hier posten, aber es ist eine sehr, sehr lange Zeichenfolge, –

+0

@ JenaroCalviño Wenn das Token wie folgt aussieht [base64] (https://en.wikipedia.org/wiki/Base64) Codierung, versuchen Sie es zuerst zu dekodieren, wie in meiner Antwort. –

+0

@ JenaroCalviño Können Sie bitte Ihre Forschungsergebnisse zur Verfügung stellen, die darauf hindeuten, dass das 'id_token' eine JSON-Zeichenfolge ist? –

0

Als @ this-vidor sagte mein id_token ein JWT nicht JSON war, und ich war schließlich in der Lage, sie zu entschlüsseln eine Bibliothek genannt jwt, habe ich jwt.decode benutzt (resp ['id_token'], verify = False) und es hat funktioniert! Sende es einfach für den Fall, dass jemand das gleiche Problem hatte und eine Lösung wollte. Vielen Dank.

Weitere Informationen über JWT