Christian Frommert

Python: Google API Zugriff mit Flask und Authlib

Ich hatte heute das Problem, dass ich mit Authlib keinen Zugriff auf die Google API bekam. Nach langem Knobeln hier die Lösung, welche Flask als Webinterface benutzt:

from flask import Flask, render_template, session, request, redirect, url_for, abort, jsonify
from authlib.client import OAuth2Session
import json

GOOGLE_CLIENT_ID = "client-id"
GOOGLE_CLIENT_SECRET = "client-secret"

REDIRECT_URI = 'http://localhost:8080/oauth2callback'
SCOPE = 'https://www.googleapis.com/auth/calendar'
AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/auth'

app = Flask(__name__)

client = OAuth2Session(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, redirect_uri=REDIRECT_URI, scope=SCOPE)

@app.route('/login')
def login():
  auth_uri, state = client.authorization_url(AUTHORIZE_URL)
  session['state'] = state
  return redirect(auth_uri)


@app.route('/oauth2callback')
def oauth2callback():
  state = request.args.get('state')
  assert state == session['state']
  access_token_url = 'https://accounts.google.com/o/oauth2/token'
  token = client.fetch_access_token(access_token_url, authorization_response=request.url)
  userdata = {'user_id': session['user_id'], 'token': token}
  return json.dumps(userdata)


@app.route('/')
@app.route('/')
def index(user_id = 0):
  session['user_id'] = user_id
  return redirect(url_for('login'))


if __name__ == '__main__':
  app.secret_key = 'hello world'
  app.run(host='localhost', port=8080)

Die oberen Konstanten (Client-ID, Client-Secret) sind natürlich anzupassen.

Der Vorteil dieser Lösung ist, dass man den Token in der oauth2callback() Funktion in einer DB ablegen kann. In Verbindung mit der dynamischen Einstiegsroute (z.B. für die ID 1234: localhost:8080/1234) und Ablage in der Session kann man so Tokens zu User IDs zuordnen und speichern.